Skip to content

Commit d0b2752

Browse files
committed
frame resizer centered
1 parent fe62190 commit d0b2752

File tree

5 files changed

+231
-108
lines changed

5 files changed

+231
-108
lines changed

packages/edit-site/src/components/layout/index.js

Lines changed: 20 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
__unstableMotion as motion,
1212
__unstableAnimatePresence as AnimatePresence,
1313
__unstableUseNavigateRegions as useNavigateRegions,
14-
ResizableBox,
1514
} from '@wordpress/components';
1615
import {
1716
useReducedMotion,
@@ -37,7 +36,7 @@ import getIsListPage from '../../utils/get-is-list-page';
3736
import Header from '../header-edit-mode';
3837
import useInitEditedEntityFromURL from '../sync-state-with-url/use-init-edited-entity-from-url';
3938
import SiteHub from '../site-hub';
40-
import ResizeHandle from '../block-editor/resize-handle';
39+
import ResizableFrame from '../resizable-frame';
4140
import useSyncCanvasModeWithURL from '../sync-state-with-url/use-sync-canvas-mode-with-url';
4241
import { unlock } from '../../private-apis';
4342
import SavePanel from '../save-panel';
@@ -46,17 +45,6 @@ import KeyboardShortcutsGlobal from '../keyboard-shortcuts/global';
4645
import { useCommands } from '../../hooks/commands';
4746

4847
const 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

6149
export 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>

packages/edit-site/src/components/layout/style.scss

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@
105105
left: 0;
106106
bottom: 0;
107107
width: 100%;
108-
108+
display: flex;
109+
justify-content: center;
110+
align-items: center;
109111
& > div {
110112
color: $gray-900;
111113
background: $white;

0 commit comments

Comments
 (0)