@@ -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 ,
@@ -37,7 +36,7 @@ import getIsListPage from '../../utils/get-is-list-page';
3736import Header from '../header-edit-mode' ;
3837import useInitEditedEntityFromURL from '../sync-state-with-url/use-init-edited-entity-from-url' ;
3938import SiteHub from '../site-hub' ;
40- import ResizeHandle from '../block-editor/resize-handle ' ;
39+ import ResizableFrame from '../resizable-frame ' ;
4140import useSyncCanvasModeWithURL from '../sync-state-with-url/use-sync-canvas-mode-with-url' ;
4241import { unlock } from '../../private-apis' ;
4342import SavePanel from '../save-panel' ;
@@ -46,17 +45,6 @@ import KeyboardShortcutsGlobal from '../keyboard-shortcuts/global';
4645import { useCommands } from '../../hooks/commands' ;
4746
4847const ANIMATION_DURATION = 0.5 ;
49- const emptyResizeHandleStyles = {
50- position : undefined ,
51- userSelect : undefined ,
52- cursor : undefined ,
53- width : undefined ,
54- height : undefined ,
55- top : undefined ,
56- right : undefined ,
57- bottom : undefined ,
58- left : undefined ,
59- } ;
6048
6149export default function Layout ( ) {
6250 // This ensures the edited entity id and type are initialized properly.
@@ -86,6 +74,7 @@ export default function Layout() {
8674 } ,
8775 [ ]
8876 ) ;
77+ const isEditing = canvasMode === 'edit' ;
8978 const navigateRegionsProps = useNavigateRegions ( {
9079 previous : previousShortcut ,
9180 next : nextShortcut ,
@@ -97,25 +86,17 @@ export default function Layout() {
9786 ( isMobileViewport && ! isListPage ) ||
9887 ( ! isMobileViewport && ( canvasMode === 'view' || ! isEditorPage ) ) ;
9988 const showCanvas =
100- ( isMobileViewport && isEditorPage && canvasMode === 'edit' ) ||
89+ ( isMobileViewport && isEditorPage && isEditing ) ||
10190 ! isMobileViewport ||
10291 ! isEditorPage ;
10392 const showFrame =
10493 ( ! isEditorPage && ! isMobileViewport ) ||
10594 ( ! isMobileViewport && isEditorPage && canvasMode === 'view' ) ;
10695 const isFullCanvas =
107- ( isMobileViewport && isListPage ) ||
108- ( isEditorPage && canvasMode === 'edit' ) ;
96+ ( isMobileViewport && isListPage ) || ( isEditorPage && isEditing ) ;
10997 const [ canvasResizer , canvasSize ] = useResizeObserver ( ) ;
110- const [ fullResizer , fullSize ] = useResizeObserver ( ) ;
111- const [ forcedWidth , setForcedWidth ] = useState ( null ) ;
112- const [ isResizing , setIsResizing ] = useState ( false ) ;
113- const isResizingEnabled = ! isMobileViewport && canvasMode === 'view' ;
114- const defaultSidebarWidth = isMobileViewport ? '100vw' : 360 ;
115- let canvasWidth = isResizing ? '100%' : fullSize . width ;
116- if ( showFrame && ! isResizing ) {
117- canvasWidth = canvasSize . width - canvasPadding ;
118- }
98+ const [ fullResizer ] = useResizeObserver ( ) ;
99+ const [ isResizing ] = useState ( false ) ;
119100
120101 // Synchronizing the URL with the store value of canvasMode happens in an effect
121102 // This condition ensures the component is only rendered after the synchronization happens
@@ -138,14 +119,14 @@ export default function Layout() {
138119 navigateRegionsProps . className ,
139120 {
140121 'is-full-canvas' : isFullCanvas ,
141- 'is-edit-mode' : canvasMode === 'edit' ,
122+ 'is-edit-mode' : isEditing ,
142123 }
143124 ) }
144125 >
145126 < SiteHub ref = { hubRef } className = "edit-site-layout__hub" />
146127
147128 < AnimatePresence initial = { false } >
148- { isEditorPage && canvasMode === 'edit' && (
129+ { isEditorPage && isEditing && (
149130 < NavigableRegion
150131 className = "edit-site-layout__header"
151132 ariaLabel = { __ ( 'Editor top bar' ) }
@@ -167,16 +148,15 @@ export default function Layout() {
167148 ease : 'easeOut' ,
168149 } }
169150 >
170- { canvasMode === 'edit' && < Header /> }
151+ { isEditing && < Header /> }
171152 </ NavigableRegion >
172153 ) }
173154 </ AnimatePresence >
174155
175156 < div className = "edit-site-layout__content" >
176157 < AnimatePresence initial = { false } >
177158 { showSidebar && (
178- < ResizableBox
179- as = { motion . div }
159+ < motion . div
180160 initial = { {
181161 opacity : 0 ,
182162 } }
@@ -188,86 +168,35 @@ export default function Layout() {
188168 } }
189169 transition = { {
190170 type : 'tween' ,
191- duration :
192- disableMotion || isResizing
193- ? 0
194- : ANIMATION_DURATION ,
171+ duration : ANIMATION_DURATION ,
195172 ease : 'easeOut' ,
196173 } }
197- size = { {
198- height : '100%' ,
199- width :
200- isResizingEnabled && forcedWidth
201- ? forcedWidth
202- : defaultSidebarWidth ,
203- } }
204174 className = "edit-site-layout__sidebar"
205- enable = { {
206- right : isResizingEnabled ,
207- } }
208- onResizeStop = { ( event , direction , elt ) => {
209- setForcedWidth ( elt . clientWidth ) ;
210- setIsResizing ( false ) ;
211- } }
212- onResizeStart = { ( ) => {
213- setIsResizing ( true ) ;
214- } }
215- onResize = { ( event , direction , elt ) => {
216- // This is a performance optimization
217- // We set the width imperatively to avoid re-rendering
218- // the whole component while resizing.
219- hubRef . current . style . width =
220- elt . clientWidth - 48 + 'px' ;
221- } }
222- handleComponent = { {
223- right : (
224- < ResizeHandle
225- direction = "right"
226- variation = "separator"
227- resizeWidthBy = { ( delta ) => {
228- setForcedWidth (
229- ( forcedWidth ??
230- defaultSidebarWidth ) +
231- delta
232- ) ;
233- } }
234- />
235- ) ,
236- } }
237- handleClasses = { undefined }
238- handleStyles = { {
239- right : emptyResizeHandleStyles ,
240- } }
241- minWidth = { isResizingEnabled ? 320 : undefined }
242- maxWidth = {
243- isResizingEnabled && fullSize
244- ? fullSize . width - 360
245- : undefined
246- }
247175 >
248176 < NavigableRegion
249177 ariaLabel = { __ ( 'Navigation sidebar' ) }
250178 >
251179 < Sidebar />
252180 </ NavigableRegion >
253- </ ResizableBox >
181+ </ motion . div >
254182 ) }
255183 </ AnimatePresence >
256184
257185 < SavePanel />
258186
259187 { showCanvas && (
260- < div
188+ < motion . div
261189 className = { classnames (
262190 'edit-site-layout__canvas-container' ,
263191 {
264192 'is-resizing' : isResizing ,
265193 }
266194 ) }
267- style = { {
195+ animate = { {
268196 paddingTop : showFrame ? canvasPadding : 0 ,
269197 paddingBottom : showFrame ? canvasPadding : 0 ,
270198 } }
199+ transition = { { duration : ANIMATION_DURATION } }
271200 >
272201 { canvasResizer }
273202 { ! ! canvasSize . width && (
@@ -299,34 +228,18 @@ export default function Layout() {
299228 ease : 'easeOut' ,
300229 } }
301230 >
302- < motion . div
303- style = { {
304- position : 'absolute' ,
305- top : 0 ,
306- left : 0 ,
307- bottom : 0 ,
308- } }
309- initial = { false }
310- animate = { {
311- width : canvasWidth ,
312- } }
313- transition = { {
314- type : 'tween' ,
315- duration :
316- disableMotion || isResizing
317- ? 0
318- : ANIMATION_DURATION ,
319- ease : 'easeOut' ,
320- } }
231+ < ResizableFrame
232+ startWidth = { canvasSize . width }
233+ isFull = { isEditing }
321234 >
322235 < ErrorBoundary >
323236 { isEditorPage && < Editor /> }
324237 { isListPage && < ListPage /> }
325238 </ ErrorBoundary >
326- </ motion . div >
239+ </ ResizableFrame >
327240 </ motion . div >
328241 ) }
329- </ div >
242+ </ motion . div >
330243 ) }
331244 </ div >
332245 </ div >
0 commit comments