diff --git a/src/v2/features/headerdrawer/HeaderDrawerRenderer.ts b/src/v2/features/headerdrawer/HeaderDrawerRenderer.ts index 1fc3864..9f14547 100644 --- a/src/v2/features/headerdrawer/HeaderDrawerRenderer.ts +++ b/src/v2/features/headerdrawer/HeaderDrawerRenderer.ts @@ -285,10 +285,15 @@ export class HeaderDrawerRenderer { } /** - * Handle drag leaving header - remove preview and restore source + * Handle drag leaving header - cleanup for grid→header drag only */ - private handleDragLeave(_payload: IDragLeaveHeaderPayload): void { - this.cleanup(); + private handleDragLeave(payload: IDragLeaveHeaderPayload): void { + // Only cleanup for grid→header drag (when grid event leaves header back to grid) + // For header→grid drag, the header item stays as ghost until drop + if (payload.source === 'grid') { + this.cleanup(); + } + // For header source, do nothing - ghost stays until EVENT_DRAG_END } /** diff --git a/src/v2/managers/DragDropManager.ts b/src/v2/managers/DragDropManager.ts index e49b929..09cfed6 100644 --- a/src/v2/managers/DragDropManager.ts +++ b/src/v2/managers/DragDropManager.ts @@ -441,6 +441,22 @@ export class DragDropManager { }; this.eventBus.emit(CoreEvents.EVENT_DRAG_LEAVE_HEADER, payload); + + // Re-attach to the new swp-event created by EventRenderer + if (targetColumn) { + const newElement = targetColumn.querySelector( + `swp-event[data-event-id="${this.dragState.eventId}"]` + ) as HTMLElement; + + if (newElement) { + this.dragState.element = newElement; + this.dragState.columnElement = targetColumn; + this.dragState.currentColumn = targetColumn; + + // Start animation for the new element + this.animateDrag(); + } + } } else { // Grid event leaving header → restore to grid const payload: IDragLeaveHeaderPayload = {