ngx-virtual-dnd 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-virtual-dnd",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "description": "A performant drag-and-drop library for Angular that works seamlessly with virtual scrolling",
5
5
  "keywords": [
6
6
  "angular",
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Signal, InjectionToken, OnDestroy, OnInit, AfterViewInit, TemplateRef, ElementRef, WritableSignal } from '@angular/core';
2
+ import { Signal, InjectionToken, OnDestroy, OnChanges, OnInit, AfterViewInit, AfterViewChecked, TemplateRef, ElementRef, WritableSignal } from '@angular/core';
3
3
 
4
4
  /**
5
5
  * Represents the item currently being dragged.
@@ -49,9 +49,13 @@ interface DragState {
49
49
  sourceIndex: number | null;
50
50
  /** ID of the droppable currently being hovered over */
51
51
  activeDroppableId: string | null;
52
- /** ID of the item the placeholder should appear before, or 'END_OF_LIST' */
52
+ /**
53
+ * `END_OF_LIST` while a droppable is targeted, otherwise null.
54
+ * @deprecated It never identifies an item. Use `placeholderIndex`. Will be removed in the next
55
+ * major version.
56
+ */
53
57
  placeholderId: string | null;
54
- /** Index where the placeholder should be inserted (more stable than placeholderId) */
58
+ /** Index where the placeholder should be inserted */
55
59
  placeholderIndex: number | null;
56
60
  /** Current cursor position */
57
61
  cursorPosition: CursorPosition | null;
@@ -100,7 +104,11 @@ interface DropSource {
100
104
  interface DropDestination {
101
105
  /** ID of the droppable container receiving the item */
102
106
  droppableId: string;
103
- /** ID of the item to insert before, or 'END_OF_LIST' */
107
+ /**
108
+ * The library always sets `END_OF_LIST`.
109
+ * @deprecated It never identifies an item. Use `index` for the insertion position. Will be
110
+ * removed in the next major version.
111
+ */
104
112
  placeholderId: string;
105
113
  /** Target index in the destination list */
106
114
  index: number;
@@ -108,7 +116,8 @@ interface DropDestination {
108
116
  data?: unknown;
109
117
  }
110
118
  /**
111
- * Event emitted when an item is dropped.
119
+ * Event emitted by the destination droppable when an item is dropped on it: at release,
120
+ * right after the dragged item's `DragEndEvent` and before the next render.
112
121
  */
113
122
  interface DropEvent {
114
123
  /** Information about where the item came from */
@@ -150,7 +159,9 @@ interface DragEndEvent {
150
159
  /** ID of the droppable container the item originated from */
151
160
  droppableId: string;
152
161
  /**
153
- * Whether the drag was actively cancelled (Escape key). Releasing over no valid
162
+ * Whether the drag was cancelled: Escape, Tab during a keyboard drag, or, during a pointer
163
+ * drag, the window losing focus, the page being hidden or the system cancelling the touch
164
+ * (`touchcancel`). Releasing over no valid
154
165
  * target (outside any droppable, or over a disabled droppable) is NOT a cancel —
155
166
  * it reports `cancelled: false` with `destinationIndex: null`. Branch on
156
167
  * `destinationIndex === null` to detect "no drop occurred".
@@ -163,7 +174,7 @@ interface DragEndEvent {
163
174
  /**
164
175
  * Final 0-indexed insertion position, or `null` when there is no valid drop target —
165
176
  * a cancelled drag, a release outside every droppable, or a release over a disabled
166
- * droppable. A non-null value pairs with a `DropEvent` on the destination.
177
+ * droppable. A non-null value pairs with the `DropEvent` the destination emits right after.
167
178
  */
168
179
  destinationIndex: number | null;
169
180
  }
@@ -172,7 +183,10 @@ interface DragEndEvent {
172
183
  */
173
184
  declare const INITIAL_DRAG_STATE: DragState;
174
185
  /**
175
- * Placeholder ID used when dropping at the end of a list.
186
+ * The value of every `placeholderId` the library sets. Positions are reported as indexes
187
+ * (`placeholderIndex`, `DropDestination.index`).
188
+ * @deprecated Goes with the deprecated `placeholderId` fields. Use the indexes. Will be removed in
189
+ * the next major version.
176
190
  */
177
191
  declare const END_OF_LIST = "END_OF_LIST";
178
192
 
@@ -230,6 +244,12 @@ declare class FixedHeightStrategy implements VirtualScrollStrategy {
230
244
  getItemHeight(index: number): number;
231
245
  setMeasuredHeight(key: unknown, height: number): void;
232
246
  setItemKeys(keys: unknown[]): void;
247
+ /**
248
+ * Set the item count: all this strategy needs of the keys, so the library's containers skip
249
+ * computing them.
250
+ * @internal
251
+ */
252
+ setItemCount(count: number): void;
233
253
  setExcludedIndex(index: number | null): void;
234
254
  findIndexAtOffset(offset: number): number;
235
255
  getItemCount(): number;
@@ -392,7 +412,7 @@ declare const VDND_ANIMATION_CONFIG: InjectionToken<VdndAnimationConfig>;
392
412
  */
393
413
  declare class DragStateService {
394
414
  #private;
395
- /** Whether the last drag was cancelled (for droppable to check before emitting drop) */
415
+ /** Whether the last drag was cancelled (a cancelled drag delivers no drop) */
396
416
  readonly wasCancelled: _angular_core.Signal<boolean>;
397
417
  /** Snapshot captured synchronously before the last drag reset. */
398
418
  readonly endedDragState: _angular_core.Signal<DragState | null>;
@@ -408,7 +428,11 @@ declare class DragStateService {
408
428
  readonly sourceIndex: _angular_core.Signal<number | null>;
409
429
  /** ID of the droppable currently being hovered over */
410
430
  readonly activeDroppableId: _angular_core.Signal<string | null>;
411
- /** ID of the item the placeholder should appear before */
431
+ /**
432
+ * `END_OF_LIST` while a droppable is targeted, otherwise null.
433
+ * @deprecated It never identifies an item. Use `placeholderIndex`. Will be removed in the next
434
+ * major version.
435
+ */
412
436
  readonly placeholderId: _angular_core.Signal<string | null>;
413
437
  /** Index where the placeholder should be inserted */
414
438
  readonly placeholderIndex: _angular_core.Signal<number | null>;
@@ -427,10 +451,12 @@ declare class DragStateService {
427
451
  constructor();
428
452
  /**
429
453
  * Start a drag operation.
454
+ * `placeholderId` is deprecated with the `placeholderId` signal; the library passes `END_OF_LIST`.
430
455
  */
431
456
  startDrag(item: DraggedItem, cursorPosition?: CursorPosition, grabOffset?: GrabOffset, lockAxis?: 'x' | 'y' | null, activeDroppableId?: string | null, placeholderId?: string | null, placeholderIndex?: number | null, sourceIndex?: number | null, isKeyboardDrag?: boolean, axisLockPosition?: CursorPosition): void;
432
457
  /**
433
458
  * Update the drag position and targets.
459
+ * `placeholderId` is deprecated with the `placeholderId` signal; the library passes `END_OF_LIST`.
434
460
  */
435
461
  updateDragPosition(update: {
436
462
  cursorPosition: CursorPosition;
@@ -443,7 +469,9 @@ declare class DragStateService {
443
469
  */
444
470
  setActiveDroppable(droppableId: string | null): void;
445
471
  /**
446
- * Update just the placeholder position.
472
+ * Update just the placeholder ID.
473
+ * @deprecated Sets only the deprecated `placeholderId`. Will be removed in the next major
474
+ * version.
447
475
  */
448
476
  setPlaceholder(placeholderId: string | null): void;
449
477
  /**
@@ -452,10 +480,12 @@ declare class DragStateService {
452
480
  * Used by the autoscroll scroll-only fast path: when a scroll fires, the cursor has not
453
481
  * moved, so only the placeholder index needs recalculation. Skipping the cursor and
454
482
  * active-droppable writes avoids spurious re-evaluation of computeds that read those signals.
483
+ * `placeholderId` is deprecated with the `placeholderId` signal; the library passes `END_OF_LIST`.
455
484
  */
456
485
  updateScrollOnlyPlaceholder(placeholderId: string | null, placeholderIndex: number | null): void;
457
486
  /**
458
- * End the drag operation and reset state (normal drop).
487
+ * End the drag operation and reset state (normal drop), then deliver the drop: the target
488
+ * droppable (`activeDroppableId`) emits `drop` before this returns.
459
489
  */
460
490
  endDrag(): void;
461
491
  /**
@@ -489,6 +519,7 @@ declare class DragStateService {
489
519
  */
490
520
  declare class PositionCalculatorService {
491
521
  #private;
522
+ constructor();
492
523
  /**
493
524
  * Begin a drag session: snapshot the candidate droppables for `groupName` and
494
525
  * their rects once, then watch for viewport changes (scroll/resize) that would
@@ -510,22 +541,22 @@ declare class PositionCalculatorService {
510
541
  */
511
542
  invalidateDroppableRects(): void;
512
543
  /**
513
- * Re-query the candidate droppable *list* for the active session and re-read their
514
- * rects. Unlike {@link invalidateDroppableRects} (which only refreshes rects), this
515
- * picks up droppables added or removed since the snapshot was captured at drag start —
516
- * the frozen candidate list is otherwise blind to mid-drag mounts/unmounts.
544
+ * Re-read the candidate droppable *list* for the active session from the registry and
545
+ * re-read their rects. Unlike {@link invalidateDroppableRects} (which only refreshes
546
+ * rects), this picks up droppables added or removed since the snapshot was captured at
547
+ * drag start. Registration changes already trigger it on the next hit-test; this is the
548
+ * manual escape hatch.
517
549
  *
518
550
  * Safe to call when no session is active (no-op).
519
551
  */
520
552
  refreshCandidates(): void;
521
553
  /**
522
554
  * Signal that the set of droppables for `groupName` may have changed (a droppable
523
- * registered or unregistered mid-drag). Defers the actual re-query to the next
524
- * hit-test — where a removed element is already gone from the DOM and a newly added
525
- * one has its data attributes applied — keeping this notification path cheap.
555
+ * registered or unregistered mid-drag). Defers the re-read to the next hit-test, keeping
556
+ * this notification path cheap.
526
557
  *
527
- * Called by {@link DroppableDirective} lifecycle hooks. No-op when the active session
528
- * belongs to a different group or no session is active.
558
+ * Called for every droppable registry change. No-op when the active session belongs to
559
+ * a different group or no session is active.
529
560
  */
530
561
  notifyCandidatesChanged(groupName: string): void;
531
562
  /**
@@ -547,8 +578,8 @@ declare class PositionCalculatorService {
547
578
  /**
548
579
  * Look up a droppable element by its ID.
549
580
  *
550
- * When a drag session is active, searches the cached candidate list (O(n), avoids a DOM
551
- * query). Falls back to `document.querySelector` when no session is active.
581
+ * When a drag session is active, searches the cached candidate list. Otherwise looks the
582
+ * ID up in the droppable registry. Neither queries the document.
552
583
  *
553
584
  * Intended for the autoscroll scroll-only fast path, where the active droppable is already
554
585
  * known and only the placeholder index needs recalculation.
@@ -870,8 +901,14 @@ interface VirtualScrollItemContext<T> {
870
901
  * </vdnd-virtual-scroll>
871
902
  * ```
872
903
  */
873
- declare class VirtualScrollContainerComponent<T> implements OnInit, AfterViewInit, OnDestroy {
904
+ declare class VirtualScrollContainerComponent<T> implements OnChanges, OnInit, AfterViewInit, AfterViewChecked, OnDestroy {
874
905
  #private;
906
+ /** The template's spacer (cannot use ES private with viewChild) */
907
+ private readonly spacer;
908
+ /** The template's content wrapper (cannot use ES private with viewChild) */
909
+ private readonly contentWrapper;
910
+ /** Where #renderRows inserts the rows (cannot use ES private with viewChild) */
911
+ private readonly rowOutlet;
875
912
  /** Template for rendering each item - passed as input instead of content child for reliability */
876
913
  itemTemplate: _angular_core.InputSignal<TemplateRef<VirtualScrollItemContext<T>>>;
877
914
  /** Unique ID for this scroll container (used for auto-scroll registration) */
@@ -918,6 +955,13 @@ declare class VirtualScrollContainerComponent<T> implements OnInit, AfterViewIni
918
955
  * Required for placeholder positioning.
919
956
  */
920
957
  droppableId: _angular_core.InputSignal<string | undefined>;
958
+ /**
959
+ * Reuse the views of rows that scroll out to render the rows that scroll in, instead of
960
+ * destroying them and creating new ones. Scrolling creates fewer components and elements, but
961
+ * a row's components, element and DOM state (focus aside) then carry over to other items.
962
+ * @default false
963
+ */
964
+ recycleRows: _angular_core.InputSignal<boolean>;
921
965
  /**
922
966
  * Whether to automatically add the dragged item to the sticky list.
923
967
  * This ensures the dragged item remains visible during virtual scrolling.
@@ -961,8 +1005,10 @@ declare class VirtualScrollContainerComponent<T> implements OnInit, AfterViewIni
961
1005
  isDragging: boolean;
962
1006
  }[]>;
963
1007
  constructor();
1008
+ ngOnChanges(): void;
964
1009
  ngOnInit(): void;
965
1010
  ngAfterViewInit(): void;
1011
+ ngAfterViewChecked(): void;
966
1012
  ngOnDestroy(): void;
967
1013
  /**
968
1014
  * Scroll to a specific position.
@@ -985,7 +1031,7 @@ declare class VirtualScrollContainerComponent<T> implements OnInit, AfterViewIni
985
1031
  */
986
1032
  scrollBy(delta: number): void;
987
1033
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<VirtualScrollContainerComponent<any>, never>;
988
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<VirtualScrollContainerComponent<any>, "vdnd-virtual-scroll", never, { "itemTemplate": { "alias": "itemTemplate"; "required": true; "isSignal": true; }; "scrollContainerId": { "alias": "scrollContainerId"; "required": false; "isSignal": true; }; "autoScrollEnabled": { "alias": "autoScrollEnabled"; "required": false; "isSignal": true; }; "autoScrollConfig": { "alias": "autoScrollConfig"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": true; "isSignal": true; }; "dynamicItemHeight": { "alias": "dynamicItemHeight"; "required": false; "isSignal": true; }; "containerHeight": { "alias": "containerHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "stickyItemIds": { "alias": "stickyItemIds"; "required": false; "isSignal": true; }; "itemIdFn": { "alias": "itemIdFn"; "required": true; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "droppableId": { "alias": "droppableId"; "required": false; "isSignal": true; }; "autoStickyDraggedItem": { "alias": "autoStickyDraggedItem"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1034
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<VirtualScrollContainerComponent<any>, "vdnd-virtual-scroll", never, { "itemTemplate": { "alias": "itemTemplate"; "required": true; "isSignal": true; }; "scrollContainerId": { "alias": "scrollContainerId"; "required": false; "isSignal": true; }; "autoScrollEnabled": { "alias": "autoScrollEnabled"; "required": false; "isSignal": true; }; "autoScrollConfig": { "alias": "autoScrollConfig"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": true; "isSignal": true; }; "dynamicItemHeight": { "alias": "dynamicItemHeight"; "required": false; "isSignal": true; }; "containerHeight": { "alias": "containerHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "stickyItemIds": { "alias": "stickyItemIds"; "required": false; "isSignal": true; }; "itemIdFn": { "alias": "itemIdFn"; "required": true; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "droppableId": { "alias": "droppableId"; "required": false; "isSignal": true; }; "recycleRows": { "alias": "recycleRows"; "required": false; "isSignal": true; }; "autoStickyDraggedItem": { "alias": "autoStickyDraggedItem"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
989
1035
  }
990
1036
 
991
1037
  /**
@@ -1040,12 +1086,11 @@ declare class DragPreviewComponent<T = unknown> implements OnDestroy {
1040
1086
  protected readonly clonedElement: _angular_core.Signal<HTMLElement | null>;
1041
1087
  constructor();
1042
1088
  ngOnDestroy(): void;
1043
- /** Whether the preview is visible */
1089
+ /**
1090
+ * Whether the preview is visible. A drag shows it once it has a position: `initialPosition`
1091
+ * is set from the drag-start cursor and, unlike `cursorPosition`, does not change per frame.
1092
+ */
1044
1093
  protected readonly isVisible: _angular_core.Signal<boolean>;
1045
- /** Position of the preview */
1046
- protected readonly position: _angular_core.Signal<CursorPosition>;
1047
- /** Transform-based positioning for better performance (avoid layout from left/top). */
1048
- protected readonly transform: _angular_core.Signal<string>;
1049
1094
  /** Dimensions of the preview */
1050
1095
  protected readonly dimensions: _angular_core.Signal<{
1051
1096
  width: number;
@@ -1188,6 +1233,13 @@ declare class VirtualSortableListComponent<T> {
1188
1233
  containerHeight: _angular_core.InputSignal<number | undefined>;
1189
1234
  /** Number of items to render above/below the visible area */
1190
1235
  overscan: _angular_core.InputSignal<number>;
1236
+ /**
1237
+ * Reuse the views of rows that scroll out to render the rows that scroll in, instead of
1238
+ * destroying them and creating new ones. Scrolling creates fewer components and elements, but
1239
+ * a row's components, element and DOM state (focus aside) then carry over to other items.
1240
+ * @default false
1241
+ */
1242
+ recycleRows: _angular_core.InputSignal<boolean>;
1191
1243
  /** Enable auto-scroll when dragging near edges */
1192
1244
  autoScrollEnabled: _angular_core.InputSignal<boolean>;
1193
1245
  /** Auto-scroll configuration */
@@ -1199,7 +1251,7 @@ declare class VirtualSortableListComponent<T> {
1199
1251
  /** Emits each time the placeholder moves within this list (every item displacement) */
1200
1252
  placeholderMove: _angular_core.OutputEmitterRef<PlaceholderMoveEvent>;
1201
1253
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<VirtualSortableListComponent<any>, never>;
1202
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<VirtualSortableListComponent<any>, "vdnd-sortable-list", never, { "droppableId": { "alias": "droppableId"; "required": true; "isSignal": true; }; "group": { "alias": "group"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": true; "isSignal": true; }; "dynamicItemHeight": { "alias": "dynamicItemHeight"; "required": false; "isSignal": true; }; "itemIdFn": { "alias": "itemIdFn"; "required": true; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": true; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "droppableData": { "alias": "droppableData"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "containerHeight": { "alias": "containerHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "autoScrollEnabled": { "alias": "autoScrollEnabled"; "required": false; "isSignal": true; }; "autoScrollConfig": { "alias": "autoScrollConfig"; "required": false; "isSignal": true; }; "constrainToContainer": { "alias": "constrainToContainer"; "required": false; "isSignal": true; }; }, { "drop": "drop"; "placeholderMove": "placeholderMove"; }, never, never, true, never>;
1254
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<VirtualSortableListComponent<any>, "vdnd-sortable-list", never, { "droppableId": { "alias": "droppableId"; "required": true; "isSignal": true; }; "group": { "alias": "group"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": true; "isSignal": true; }; "dynamicItemHeight": { "alias": "dynamicItemHeight"; "required": false; "isSignal": true; }; "itemIdFn": { "alias": "itemIdFn"; "required": true; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": true; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "droppableData": { "alias": "droppableData"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "containerHeight": { "alias": "containerHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "recycleRows": { "alias": "recycleRows"; "required": false; "isSignal": true; }; "autoScrollEnabled": { "alias": "autoScrollEnabled"; "required": false; "isSignal": true; }; "autoScrollConfig": { "alias": "autoScrollConfig"; "required": false; "isSignal": true; }; "constrainToContainer": { "alias": "constrainToContainer"; "required": false; "isSignal": true; }; }, { "drop": "drop"; "placeholderMove": "placeholderMove"; }, never, never, true, never>;
1203
1255
  }
1204
1256
 
1205
1257
  /**
@@ -1385,7 +1437,7 @@ declare class VirtualContentComponent implements VdndVirtualViewport, VdndScroll
1385
1437
  * </div>
1386
1438
  * ```
1387
1439
  */
1388
- declare class DraggableDirective implements OnInit, OnDestroy {
1440
+ declare class DraggableDirective implements OnChanges, OnInit, OnDestroy {
1389
1441
  #private;
1390
1442
  /** Unique identifier for this draggable */
1391
1443
  vdndDraggable: _angular_core.InputSignal<string>;
@@ -1419,10 +1471,16 @@ declare class DraggableDirective implements OnInit, OnDestroy {
1419
1471
  dragStart: _angular_core.OutputEmitterRef<DragStartEvent>;
1420
1472
  /** Emits when drag ends */
1421
1473
  dragEnd: _angular_core.OutputEmitterRef<DragEndEvent>;
1474
+ /**
1475
+ * Whether this element is in the "ready to drag" state (delay has passed). Tied to the pressed
1476
+ * item: a recycled row that renders another item is not ready to drag.
1477
+ */
1422
1478
  readonly isPending: _angular_core.Signal<boolean>;
1423
1479
  /** Whether this element is currently being dragged (based on global drag state) */
1424
1480
  readonly isDragging: _angular_core.Signal<boolean>;
1481
+ constructor();
1425
1482
  ngOnInit(): void;
1483
+ ngOnChanges(): void;
1426
1484
  ngOnDestroy(): void;
1427
1485
  /**
1428
1486
  * Handle pointer down (mouse or touch).
@@ -1494,7 +1552,7 @@ declare class DroppableDirective implements OnDestroy {
1494
1552
  autoScrollConfig: _angular_core.InputSignal<Partial<AutoScrollConfig>>;
1495
1553
  /** Constrain drag preview and placeholder to container boundaries */
1496
1554
  constrainToContainer: _angular_core.InputSignal<boolean>;
1497
- /** Emits when an item is dropped on this droppable */
1555
+ /** Emits when an item is dropped on this droppable: at release, right after its `dragEnd` */
1498
1556
  drop: _angular_core.OutputEmitterRef<DropEvent>;
1499
1557
  /**
1500
1558
  * Emits each time the placeholder moves within this droppable during a drag
@@ -1503,7 +1561,11 @@ declare class DroppableDirective implements OnDestroy {
1503
1561
  placeholderMove: _angular_core.OutputEmitterRef<PlaceholderMoveEvent>;
1504
1562
  /** Whether this droppable is currently being targeted */
1505
1563
  readonly isActive: _angular_core.Signal<boolean>;
1506
- /** The current placeholder ID when this droppable is active */
1564
+ /**
1565
+ * `END_OF_LIST` while this droppable is active, otherwise null.
1566
+ * @deprecated It never identifies an item. For the position, use the `placeholderMove` output
1567
+ * (and `DropEvent.destination.index` on drop). Will be removed in the next major version.
1568
+ */
1507
1569
  readonly placeholderId: _angular_core.Signal<string | null>;
1508
1570
  constructor();
1509
1571
  ngOnDestroy(): void;