@@ -144,6 +144,8 @@ class Drag implements IDisposable {
144144 this . proposedAction = options . proposedAction || 'copy' ;
145145 this . supportedActions = options . supportedActions || 'all' ;
146146 this . source = options . source || null ;
147+ this . _dragAdjustX = options . dragAdjustX || 0 ;
148+ this . _dragAdjustY = options . dragAdjustY || 0 ;
147149 }
148150
149151 /**
@@ -233,6 +235,9 @@ class Drag implements IDisposable {
233235 return this . _promise ;
234236 }
235237
238+ this . _dragOffsetX = ( this . _dragAdjustX ) ? this . _dragAdjustX - clientX : 0 ;
239+ this . _dragOffsetY = ( this . _dragAdjustY ) ? this . _dragAdjustY - clientY : 0 ;
240+
236241 // Install the document listeners for the drag object.
237242 this . _addListeners ( ) ;
238243
@@ -291,8 +296,8 @@ class Drag implements IDisposable {
291296 return ;
292297 }
293298 let style = this . dragImage . style ;
294- style . top = `${ clientY } px` ;
295- style . left = `${ clientX } px` ;
299+ style . top = `${ clientY + this . dragOffsetY } px` ;
300+ style . left = `${ clientX + this . dragOffsetX } px` ;
296301 }
297302
298303 /**
@@ -311,7 +316,7 @@ class Drag implements IDisposable {
311316
312317 // Move the drag image to the specified client position. This is
313318 // performed *after* dispatching to prevent unnecessary reflows.
314- this . moveDragImage ( event . clientX , event . clientY ) ;
319+ this . moveDragImage ( event . clientX + this . dragOffsetX , event . clientY + this . dragOffsetY ) ;
315320 }
316321
317322 /**
@@ -405,7 +410,7 @@ class Drag implements IDisposable {
405410 */
406411 private _updateDragScroll ( event : MouseEvent ) : void {
407412 // Find the scroll target under the mouse.
408- let target = Private . findScrollTarget ( event ) ;
413+ let target = Private . findScrollTarget ( event , this . dragOffsetX , this . dragOffsetY ) ;
409414
410415 // Bail if there is nothing to scroll.
411416 if ( ! this . _scrollTarget && ! target ) {
@@ -601,6 +606,14 @@ class Drag implements IDisposable {
601606 requestAnimationFrame ( this . _onScrollFrame ) ;
602607 } ;
603608
609+ get dragOffsetX ( ) : number {
610+ return this . _dragOffsetX ;
611+ }
612+
613+ get dragOffsetY ( ) : number {
614+ return this . _dragOffsetY ;
615+ }
616+
604617 private _disposed = false ;
605618 private _dropAction : DropAction = 'none' ;
606619 private _override : IDisposable | null = null ;
@@ -609,6 +622,10 @@ class Drag implements IDisposable {
609622 private _promise : Promise < DropAction > | null = null ;
610623 private _scrollTarget : Private . IScrollTarget | null = null ;
611624 private _resolve : ( ( value : DropAction ) => void ) | null = null ;
625+ private _dragAdjustX : number ;
626+ private _dragAdjustY : number ;
627+ private _dragOffsetX : number ;
628+ private _dragOffsetY : number ;
612629}
613630
614631
@@ -681,6 +698,20 @@ namespace Drag {
681698 * The default value is `null`.
682699 */
683700 source ?: any ;
701+
702+ /**
703+ * How many pixels to offset the drag/image in the x direction.
704+ *
705+ * The default value is 0.
706+ */
707+ dragAdjustX ?: number ;
708+
709+ /**
710+ * How many pixels to offset the drag/image in the y direction.
711+ *
712+ * The default value is 0.
713+ */
714+ dragAdjustY ?: number ;
684715 }
685716
686717 /**
@@ -797,19 +828,26 @@ namespace Private {
797828
798829 /**
799830 * Find the drag scroll target under the mouse, if any.
831+ *
832+ * @param event - The mouse event related to the action.
833+ *
834+ * @param dragOffsetX - the number of pixels to offset the drag in the x direction.
835+ *
836+ * @param dragOffsetY - the number of pixels to offset the drag in the y direction.
800837 */
801838 export
802- function findScrollTarget ( event : MouseEvent ) : IScrollTarget | null {
839+ function findScrollTarget ( event : MouseEvent , dragOffsetX ?: number , dragOffsetY ?: number ) : IScrollTarget | null {
803840 // Look up the client mouse position.
804- let x = event . clientX ;
805- let y = event . clientY ;
841+ const x = event . clientX + ( dragOffsetX !== undefined ? dragOffsetX : 0 ) ;
842+ const y = event . clientY + ( dragOffsetY !== undefined ? dragOffsetY : 0 ) ;
806843
807844 // Get the element under the mouse.
808845 let element : Element | null = document . elementFromPoint ( x , y ) ;
809846
810847 // Search for a scrollable target based on the mouse position.
811848 // The null assert in third clause of for-loop is required due to:
812849 // https://github.com/Microsoft/TypeScript/issues/14143
850+
813851 for ( ; element ; element = element ! . parentElement ) {
814852 // Ignore elements which are not marked as scrollable.
815853 let scrollable = element . hasAttribute ( 'data-lm-dragscroll' ) ;
@@ -1174,8 +1212,8 @@ namespace Private {
11741212 // Initialize the mouse event data.
11751213 dragEvent . initMouseEvent (
11761214 type , true , true , window , 0 ,
1177- event . screenX , event . screenY ,
1178- event . clientX , event . clientY ,
1215+ event . screenX + drag . dragOffsetX , event . screenY + drag . dragOffsetY ,
1216+ event . clientX + drag . dragOffsetX , event . clientY + drag . dragOffsetY ,
11791217 event . ctrlKey , event . altKey ,
11801218 event . shiftKey , event . metaKey ,
11811219 event . button , related
0 commit comments