fix(builder): duplicate inserts+selects after source; select-parent/styles-sheet/canvas-pad mobile fixes
Ship-blocking fix (Fable consult): useNodeActions.duplicate() appended the regenerated tree at the end of the parent while leaving the ORIGINAL selected, so duplicating a top-level section landed the copy off-screen at the bottom of the page with no visible change -- shared by both the mobile selection toolbar and the desktop right-click ContextMenu. Now inserts the copy immediately after the source (actions.addNodeTree(tree, parentId, sourceIndex + 1)) and selects it (actions.selectNode(tree.rootNodeId)), falling back to append-at-end if the source's index can't be resolved. Mobile also scrolls the new node into view. Three cheap fast-follows: - canSelectParent on useNodeActions (false when the node's parent is ROOT or missing); MobileSelectionToolbar disables "Select Parent" instead of dead-ending on a page-wide ROOT outline with no toolbar of its own. - Opening the Styles sheet on mobile now scrolls the selected node above the 65dvh sheet; a temporary generous bottom-padding class handles the case where the node is the last thing on the page and there'd otherwise be no room left to scroll it into view. - Canvas gets bottom padding equal to the fixed selection toolbar's height while it's visible, so the last section of a short page isn't stuck permanently underneath it. Desktop duplicate behavior improves (inserts after + selects) via the shared hook; no toHtml changes. Verified live via Playwright at 375px and 1280px (screenshots in craft/scratchpad/mobileB2/). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,11 @@
|
||||
/* Phase A (mobile): fixed bottom tab bar height, used to size
|
||||
.editor-container and the safe-area padding math below. */
|
||||
--mobile-tabbar-height: 58px;
|
||||
/* Phase B fast-follow item 4: rendered height of `.mobile-selection-toolbar`
|
||||
(44px min-height content + 4px top/bottom padding + 1px border) -- used
|
||||
to pad the canvas scroll area clear of it while it's visible, see
|
||||
`.editor-canvas.has-mobile-selection-toolbar` below. */
|
||||
--mobile-selection-toolbar-height: 53px;
|
||||
|
||||
/* Mobile-A2: explicit overlay layer scale (was ad-hoc numbers scattered
|
||||
across the mobile block + Modal.tsx, causing accidental stacking --
|
||||
@@ -1685,6 +1690,31 @@ body {
|
||||
background: rgba(239, 68, 68, 0.15);
|
||||
}
|
||||
|
||||
/* Fast-follow item 4: while the toolbar above is visible, give the canvas
|
||||
scroll area enough extra bottom padding to clear it (on top of the
|
||||
regular 12px `.editor-canvas` padding, not replacing it), so the last
|
||||
section of a short page is still reachable by scrolling instead of
|
||||
sitting permanently underneath the fixed toolbar. */
|
||||
.editor-canvas.has-mobile-selection-toolbar {
|
||||
padding-bottom: calc(12px + var(--mobile-selection-toolbar-height));
|
||||
}
|
||||
|
||||
/* Fast-follow item 3: while the Styles sheet is open with a node selected,
|
||||
`MobileSelectionToolbar`'s scroll-into-view effect needs somewhere to
|
||||
scroll THE NODE TO even when it's the last thing on the page -- without
|
||||
extra room below it, the canvas is already at its max scrollTop and the
|
||||
node's top can't be brought up past wherever it naturally landed
|
||||
(verified live: the last section stayed stuck under the sheet). A full
|
||||
extra viewport's worth of bottom padding guarantees any node's top can
|
||||
always reach the very top of the canvas. Temporary/cosmetic cost (a
|
||||
stretch of blank canvas below the real content while this is active) is
|
||||
an acceptable trade for the node never being permanently unreachable.
|
||||
-------------------------------------------------------------------- */
|
||||
.editor-canvas.has-mobile-styles-sheet {
|
||||
padding-bottom: 100vh;
|
||||
padding-bottom: 100dvh;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
Bottom sheet (BottomSheet.tsx)
|
||||
-------------------------------------------------------------------- */
|
||||
|
||||
Reference in New Issue
Block a user