Transfer
Between two layouts
pointer is in the target's canvas coordinates. The item keeps roughly the same visual proportion: its size is scaled by the ratio of the two canvases' inner areas (scaleSizeBetweenCanvases) and capped at the target's inner size, unless you pass an explicit size. Placement uses the pointer form of placeItem, so a preview is always available; the transfer reports accepted: false only when placement did.
Between nested containers
Containers are layouts, so the same call works once the coordinates line up:
findContainerAt with an inset keeps a drag that brushes an edge from switching targets, and sourceId lets the origin container win without the inset. Before starting, check isInsideLockedSubtree and isDirectChildOfContained so locked and contained nodes stay put.
Between React providers
Wrap the providers in a GridTransferScope. Nothing else changes: dragging an item out of one canvas and over another previews the drop there and commits on release.
How it works: on every pointer move the source canvas reports the client point to the scope, which finds the deepest registered canvas under the pointer that acceptTransfers allows. While the pointer is still inside the source element only its descendants may win, so nested boards behave. The target previews the item with placeItem at the pointer, after scaling its size so it keeps the same on-screen pixels; the source marks the item as transferring (rendered at 40% opacity by GridItem). On release the target commits (onLayoutChange with reason: 'transfer'), the source removes the item, and both onTransferOut and onTransferIn fire.