33 draggable ,
44 dropTargetForElements ,
55} from "@atlaskit/pragmatic-drag-and-drop/element/adapter" ;
6+ import { preventUnhandled } from "@atlaskit/pragmatic-drag-and-drop/prevent-unhandled" ;
67import { attachClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge" ;
78import type { DocHandle , Prop } from "@automerge/automerge-repo" ;
89import Popover from "@corvu/popover" ;
@@ -150,6 +151,7 @@ export function NotebookCell(props: {
150151
151152 const [ closestEdge , setClosestEdge ] = createSignal < ClosestEdge > ( null ) ;
152153 const [ dropTarget , setDropTarget ] = createSignal ( false ) ;
154+ const [ isDragging , setIsDragging ] = createSignal ( false ) ;
153155
154156 const isActiveDropTarget = ( ) => props . currentDropTarget === props . cellId ;
155157 createEffect ( ( ) => {
@@ -164,14 +166,37 @@ export function NotebookCell(props: {
164166 draggable ( {
165167 element : handleRef ,
166168 getInitialData : ( ) => createCellDragData ( props . cellId , props . index ) ,
169+ onGenerateDragPreview ( { nativeSetDragImage } ) {
170+ if ( nativeSetDragImage ) {
171+ // Clone the cell content for the drag preview
172+ const cellContent = rootRef . querySelector ( ".cell-content" ) ;
173+ if ( cellContent ) {
174+ const preview = cellContent . cloneNode ( true ) as HTMLElement ;
175+ preview . style . width = `${ cellContent . clientWidth } px` ;
176+ preview . style . opacity = "0.8" ;
177+ preview . style . pointerEvents = "none" ;
178+ document . body . appendChild ( preview ) ;
179+ nativeSetDragImage ( preview , 0 , 0 ) ;
180+
181+ setTimeout ( ( ) => {
182+ preview . remove ( ) ;
183+ } , 0 ) ;
184+ }
185+ }
186+ } ,
187+ onDragStart ( ) {
188+ setIsDragging ( true ) ;
189+ preventUnhandled . start ( ) ;
190+ } ,
191+ onDrop ( ) {
192+ setIsDragging ( false ) ;
193+ preventUnhandled . stop ( ) ;
194+ } ,
167195 } ) ,
168196 dropTargetForElements ( {
169197 element : rootRef ,
170198 canDrop ( { source } ) {
171199 // TODO: Reject if cell belongs to a different notebook.
172- if ( source . data . cellId === props . cellId ) {
173- return false ;
174- }
175200 return isCellDragData ( source . data ) ;
176201 } ,
177202 getData ( { input } ) {
@@ -185,15 +210,11 @@ export function NotebookCell(props: {
185210 onDragEnter ( args ) {
186211 const sourceIndex = args . source . data . index as number ;
187212 const targetIndex = args . self . data . index as number ;
188- if ( sourceIndex === targetIndex ) {
189- setClosestEdge ( null ) ;
190- setDropTarget ( false ) ;
191- } else {
192- props . setCurrentDropTarget ( props . cellId ) ;
193- const edge = sourceIndex < targetIndex ? "bottom" : "top" ;
194- setClosestEdge ( edge ) ;
195- setDropTarget ( true ) ;
196- }
213+
214+ props . setCurrentDropTarget ( props . cellId ) ;
215+ const edge = sourceIndex < targetIndex ? "bottom" : "top" ;
216+ setClosestEdge ( edge ) ;
217+ setDropTarget ( true ) ;
197218 } ,
198219 onDrop ( ) {
199220 setDropTarget ( false ) ;
@@ -205,7 +226,13 @@ export function NotebookCell(props: {
205226 } ) ;
206227
207228 return (
208- < div class = "cell" onMouseEnter = { showGutter } onMouseLeave = { hideGutter } ref = { rootRef } >
229+ < div
230+ class = "cell"
231+ classList = { { "cell-dragging" : isDragging ( ) } }
232+ onMouseEnter = { showGutter }
233+ onMouseLeave = { hideGutter }
234+ ref = { rootRef }
235+ >
209236 < div class = "cell-gutter" >
210237 < IconButton
211238 onClick = { props . actions . createBelow }
0 commit comments