@@ -24,6 +24,66 @@ declare module '@shopify/draggable' {
24
24
25
25
export { AbstractEvent as BaseEvent } ;
26
26
27
+ type GetEventByEventName < eventName > = eventName extends 'draggable:initialize'
28
+ ? DraggableInitializedEvent
29
+ : eventName extends 'draggable:destroy'
30
+ ? DraggableDestroyEvent
31
+ : eventName extends 'drag:start'
32
+ ? DragStartEvent
33
+ : eventName extends 'drag:move'
34
+ ? DragMoveEvent
35
+ : eventName extends 'drag:over'
36
+ ? DragOverEvent
37
+ : eventName extends 'drag:over:container'
38
+ ? DragOverContainerEvent
39
+ : eventName extends 'drag:out'
40
+ ? DragOutEvent
41
+ : eventName extends 'drag:out:container'
42
+ ? DragOutContainerEvent
43
+ : eventName extends 'drag:stop'
44
+ ? DragStopEvent
45
+ : eventName extends 'drag:pressure'
46
+ ? DragPressureEvent
47
+ : eventName extends 'mirror:create'
48
+ ? MirrorCreateEvent
49
+ : eventName extends 'mirror:created'
50
+ ? MirrorCreatedEvent
51
+ : eventName extends 'mirror:attached'
52
+ ? MirrorAttachedEvent
53
+ : eventName extends 'mirror:move'
54
+ ? MirrorMoveEvent
55
+ : eventName extends 'mirror:destroy'
56
+ ? MirrorDestroyEvent
57
+ : eventName extends 'droppable:dropped'
58
+ ? DroppableDroppedEvent
59
+ : eventName extends 'droppable:returned'
60
+ ? DroppableReturnedEvent
61
+ : eventName extends 'sortable:start'
62
+ ? SortableStartEvent
63
+ : eventName extends 'sortable:sort'
64
+ ? SortableSortEvent
65
+ : eventName extends 'sortable:sorted'
66
+ ? SortableSortedEvent
67
+ : eventName extends 'sortable:stop'
68
+ ? SortableStopEvent
69
+ : eventName extends 'swappable:start'
70
+ ? SwappableStartEvent
71
+ : eventName extends 'swappable:swap'
72
+ ? SwappableSwapEvent
73
+ : eventName extends 'swappable:swapped'
74
+ ? SwappableSwappedEvent
75
+ : eventName extends 'swappable:stop'
76
+ ? SwappableStopEvent
77
+ : eventName extends 'collidable:in'
78
+ ? CollidableInEvent
79
+ : eventName extends 'collidable:out'
80
+ ? CollidableOutEvent
81
+ : eventName extends 'snap:in'
82
+ ? SnapInEvent
83
+ : eventName extends 'snap:out'
84
+ ? SnapOutEvent
85
+ : AbstractEvent ;
86
+
27
87
/**
28
88
* DragEvent
29
89
*/
@@ -77,7 +137,8 @@ declare module '@shopify/draggable' {
77
137
'drag:out' |
78
138
'drag:out:container' |
79
139
'drag:stop' |
80
- 'drag:pressure' ;
140
+ 'drag:pressure' |
141
+ MirrorEventNames ;
81
142
82
143
export class DraggableEvent extends AbstractEvent {
83
144
readonly draggable : Draggable ;
@@ -113,7 +174,7 @@ declare module '@shopify/draggable' {
113
174
swapAnimation ?: SwapAnimationOptions ;
114
175
}
115
176
116
- export class Draggable < EventListType extends string = DraggableEventNames | MirrorEventNames > {
177
+ export class Draggable < EventListType = DraggableEventNames > {
117
178
static Plugins : {
118
179
Announcement : typeof Announcement ,
119
180
Focusable : typeof Focusable ,
@@ -122,8 +183,8 @@ declare module '@shopify/draggable' {
122
183
} ;
123
184
constructor ( containers : DraggableContainer , options ?: DraggableOptions ) ;
124
185
destroy ( ) : void ;
125
- on ( eventName : EventListType , callback : ( event : AbstractEvent ) => void ) : this;
126
- off ( eventName : EventListType , callback : ( event : AbstractEvent ) => void ) : this;
186
+ on < T extends EventListType > ( eventName : T , callback : ( event : GetEventByEventName < T > ) => void ) : this;
187
+ off < T extends EventListType > ( eventName : T , callback : ( event : GetEventByEventName < T > ) => void ) : this;
127
188
trigger ( event : typeof AbstractEvent ) : void ;
128
189
addPlugin ( ...plugins : Array < typeof AbstractPlugin > ) : this;
129
190
removePlugin ( ...plugins : Array < typeof AbstractPlugin > ) : this;
@@ -278,7 +339,8 @@ declare module '@shopify/draggable' {
278
339
*/
279
340
export type DroppableEventNames =
280
341
'droppable:dropped' |
281
- 'droppable:returned' ;
342
+ 'droppable:returned' |
343
+ DraggableEventNames ;
282
344
283
345
export class DroppableEvent extends AbstractEvent {
284
346
readonly dragEvent : DragEvent ;
@@ -310,7 +372,7 @@ declare module '@shopify/draggable' {
310
372
classes ?: { [ key in DroppableClassNames ] : string } ;
311
373
}
312
374
313
- export class Droppable extends Draggable < DraggableEventNames | DroppableEventNames | MirrorEventNames > {
375
+ export class Droppable < T = DroppableEventNames > extends Draggable < T > {
314
376
constructor ( containers : DraggableContainer , options : DroppableOptions ) ;
315
377
getClassNameFor ( name : DroppableClassNames ) : string ;
316
378
}
@@ -322,7 +384,8 @@ declare module '@shopify/draggable' {
322
384
'sortable:start' |
323
385
'sortable:sort' |
324
386
'sortable:sorted' |
325
- 'sortable:stop' ;
387
+ 'sortable:stop' |
388
+ DraggableEventNames ;
326
389
327
390
export class SortableEvent extends AbstractEvent {
328
391
readonly dragEvent : DragEvent ;
@@ -354,7 +417,7 @@ declare module '@shopify/draggable' {
354
417
readonly newContainer : HTMLElement ;
355
418
}
356
419
357
- export class Sortable extends Draggable < DraggableEventNames | MirrorEventNames | SortableEventNames > { }
420
+ export class Sortable < T = SortableEventNames > extends Draggable < T > { }
358
421
359
422
/**
360
423
* Swappable
@@ -363,7 +426,8 @@ declare module '@shopify/draggable' {
363
426
'swappable:start' |
364
427
'swappable:swap' |
365
428
'swappable:swapped' |
366
- 'swappable:stop' ;
429
+ 'swappable:stop' |
430
+ DraggableEventNames ;
367
431
368
432
export class SwappableEvent extends AbstractEvent {
369
433
readonly dragEvent : DragEvent ;
@@ -382,11 +446,22 @@ declare module '@shopify/draggable' {
382
446
383
447
export class SwappableStopEvent extends SwappableEvent { }
384
448
385
- export class Swappable extends Draggable < DraggableEventNames | MirrorEventNames | SwappableEventNames > { }
449
+ export class Swappable < T = SwappableEventNames > extends Draggable < T > { }
386
450
387
451
/**
388
452
* Collidable Plugin
389
453
*/
454
+ export type CollidableEventNames =
455
+ 'collidable:in' |
456
+ 'collidable:out' ;
457
+
458
+ export class CollidableEvent extends AbstractEvent {
459
+ readonly dragEvent : DragEvent ;
460
+ readonly collidingElement : HTMLElement ;
461
+ }
462
+ export class CollidableInEvent extends CollidableEvent { }
463
+ export class CollidableOutEvent extends CollidableEvent { }
464
+
390
465
export type Collidables = string | NodeList | HTMLElement [ ] | ( ( ) => NodeList | HTMLElement [ ] ) ;
391
466
392
467
class Collidable extends AbstractPlugin {
@@ -395,23 +470,34 @@ declare module '@shopify/draggable' {
395
470
}
396
471
397
472
/**
398
- * ResizeMirror
473
+ * ResizeMirror Plugin
399
474
*/
400
475
class ResizeMirror extends AbstractPlugin {
401
476
protected attach ( ) : void ;
402
477
protected detach ( ) : void ;
403
478
}
404
479
405
480
/**
406
- * Snappable
481
+ * Snappable Plugin
407
482
*/
483
+ export type SnappableEventNames =
484
+ 'snap:in' |
485
+ 'snap:out' ;
486
+
487
+ export class SnapEvent extends AbstractEvent {
488
+ readonly dragEvent : DragEvent ;
489
+ readonly snappable : HTMLElement ;
490
+ }
491
+ export class SnapInEvent extends SnapEvent { }
492
+ export class SnapOutEvent extends SnapEvent { }
493
+
408
494
class Snappable extends AbstractPlugin {
409
495
protected attach ( ) : void ;
410
496
protected detach ( ) : void ;
411
497
}
412
498
413
499
/**
414
- * SwapAnimation
500
+ * SwapAnimation Plugin
415
501
*/
416
502
export interface SwapAnimationOptions {
417
503
duration : number ;
0 commit comments