ngx-virtual-dnd 3.0.0 → 3.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-virtual-dnd.mjs","sources":["../../../projects/ngx-virtual-dnd/src/lib/models/drag-drop.models.ts","../../../projects/ngx-virtual-dnd/src/lib/strategies/fixed-height.strategy.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/height-cache.ts","../../../projects/ngx-virtual-dnd/src/lib/strategies/dynamic-height.strategy.ts","../../../projects/ngx-virtual-dnd/src/lib/tokens/scroll-container.token.ts","../../../projects/ngx-virtual-dnd/src/lib/tokens/virtual-viewport.token.ts","../../../projects/ngx-virtual-dnd/src/lib/services/drag-state.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/position-calculator.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/auto-scroll.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/element-clone.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/keyboard-drag.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/overlay-container.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/drag-index-calculator.service.ts","../../../projects/ngx-virtual-dnd/src/lib/components/drag-placeholder.component.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/dom-signal-bindings.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-scroll-container.component.ts","../../../projects/ngx-virtual-dnd/src/lib/components/drag-preview.component.ts","../../../projects/ngx-virtual-dnd/src/lib/components/placeholder.component.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/droppable-group.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/group-resolution.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/droppable.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-sortable-list.component.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-viewport.component.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/content-header.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-content.component.ts","../../../projects/ngx-virtual-dnd/src/lib/handlers/keyboard-drag.handler.ts","../../../projects/ngx-virtual-dnd/src/lib/handlers/pointer-drag.handler.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/draggable.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/scrollable.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/virtual-for.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/drop-helpers.ts","../../../projects/ngx-virtual-dnd/src/lib/index.ts","../../../projects/ngx-virtual-dnd/src/public-api.ts","../../../projects/ngx-virtual-dnd/src/ngx-virtual-dnd.ts"],"sourcesContent":["/**\n * Represents the item currently being dragged.\n */\nexport interface DraggedItem {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Reference to the dragged element */\n element: HTMLElement;\n /** Cloned element for use in drag preview (auto-generated) */\n clonedElement?: HTMLElement;\n /** Height of the dragged element in pixels */\n height: number;\n /** Width of the dragged element in pixels */\n width: number;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n}\n\n/**\n * Current position of the cursor during drag.\n */\nexport interface CursorPosition {\n x: number;\n y: number;\n}\n\n/**\n * Offset from cursor to the top-left corner of the dragged element.\n * Used to maintain grab position during drag.\n */\nexport interface GrabOffset {\n x: number;\n y: number;\n}\n\n/**\n * Complete state of the drag-and-drop system.\n */\nexport interface DragState {\n /** Whether a drag operation is currently in progress */\n isDragging: boolean;\n /** Information about the item being dragged */\n draggedItem: DraggedItem | null;\n /** ID of the droppable where the drag started */\n sourceDroppableId: string | null;\n /** Original index of the dragged item in the source list */\n sourceIndex: number | null;\n /** ID of the droppable currently being hovered over */\n activeDroppableId: string | null;\n /** ID of the item the placeholder should appear before, or 'END_OF_LIST' */\n placeholderId: string | null;\n /** Index where the placeholder should be inserted (more stable than placeholderId) */\n placeholderIndex: number | null;\n /** Current cursor position */\n cursorPosition: CursorPosition | null;\n /** Offset from cursor to element top-left (for maintaining grab position) */\n grabOffset: GrabOffset | null;\n /** Position when drag started (for axis locking) */\n initialPosition: CursorPosition | null;\n /** Axis to lock movement to ('x' = horizontal only, 'y' = vertical only) */\n lockAxis: 'x' | 'y' | null;\n /** Whether this is a keyboard-initiated drag */\n isKeyboardDrag: boolean;\n /** Target index during keyboard navigation */\n keyboardTargetIndex: number | null;\n}\n\n/**\n * Event emitted when a drag operation starts.\n */\nexport interface DragStartEvent {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n /** Position where the drag started */\n position: CursorPosition;\n /** 0-indexed position in the source list (for screen reader announcements) */\n sourceIndex: number;\n}\n\n/**\n * Source information for a drop event.\n */\nexport interface DropSource {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Original index in the source list */\n index: number;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n}\n\n/**\n * Destination information for a drop event.\n */\nexport interface DropDestination {\n /** ID of the droppable container receiving the item */\n droppableId: string;\n /** ID of the item to insert before, or 'END_OF_LIST' */\n placeholderId: string;\n /** Target index in the destination list */\n index: number;\n /** Optional user-provided data associated with the droppable */\n data?: unknown;\n}\n\n/**\n * Event emitted when an item is dropped.\n */\nexport interface DropEvent {\n /** Information about where the item came from */\n source: DropSource;\n /** Information about where the item is going */\n destination: DropDestination;\n}\n\n/**\n * Event emitted when a drag operation ends (including cancel).\n */\nexport interface DragEndEvent {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Whether the drag was cancelled (escaped, dropped outside) */\n cancelled: boolean;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n /** Original 0-indexed position in source list (for cancel announcements) */\n sourceIndex: number;\n /** Final 0-indexed position (null if cancelled) */\n destinationIndex: number | null;\n}\n\n/**\n * Initial state for the drag state service.\n */\nexport const INITIAL_DRAG_STATE: DragState = {\n isDragging: false,\n draggedItem: null,\n sourceDroppableId: null,\n sourceIndex: null,\n activeDroppableId: null,\n placeholderId: null,\n placeholderIndex: null,\n cursorPosition: null,\n grabOffset: null,\n initialPosition: null,\n lockAxis: null,\n isKeyboardDrag: false,\n keyboardTargetIndex: null,\n};\n\n/**\n * Placeholder ID used when dropping at the end of a list.\n */\nexport const END_OF_LIST = 'END_OF_LIST';\n","import { signal } from '@angular/core';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\n\n/**\n * Fixed-height virtual scroll strategy.\n *\n * Wraps the existing `index * itemHeight` math with zero overhead — no cache,\n * no measurement. This is the default strategy used when `dynamicItemHeight`\n * is not enabled.\n */\nexport class FixedHeightStrategy implements VirtualScrollStrategy {\n readonly #itemHeight: number;\n\n /** Excluded index during same-list drag (-1 = none) */\n #excludedIndex = -1;\n\n /** Logical item count from setItemKeys (used by drag index calculator) */\n #itemCount = 0;\n\n /** Version signal — bumps when exclusion changes */\n readonly #version = signal(0);\n readonly version = this.#version.asReadonly();\n\n constructor(itemHeight: number) {\n this.#itemHeight = itemHeight;\n }\n\n getTotalHeight(itemCount: number): number {\n return itemCount * this.#itemHeight;\n }\n\n getFirstVisibleIndex(scrollTop: number): number {\n if (this.#itemHeight <= 0) return 0;\n return Math.floor(scrollTop / this.#itemHeight);\n }\n\n getVisibleCount(_startIndex: number, containerHeight: number): number {\n if (containerHeight <= 0 || this.#itemHeight <= 0) return 0;\n return Math.ceil(containerHeight / this.#itemHeight);\n }\n\n getOffsetForIndex(index: number): number {\n if (this.#excludedIndex >= 0 && index > this.#excludedIndex) {\n return (index - 1) * this.#itemHeight;\n }\n return index * this.#itemHeight;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getItemHeight(index: number): number {\n return this.#itemHeight;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setMeasuredHeight(key: unknown, height: number): void {\n // No-op for fixed height strategy\n }\n\n setItemKeys(keys: unknown[]): void {\n const prevCount = this.#itemCount;\n this.#itemCount = keys.length;\n if (prevCount !== this.#itemCount) {\n this.#version.update((v) => v + 1);\n }\n }\n\n setExcludedIndex(index: number | null): void {\n const newIndex = index ?? -1;\n if (this.#excludedIndex !== newIndex) {\n this.#excludedIndex = newIndex;\n this.#version.update((v) => v + 1);\n }\n }\n\n findIndexAtOffset(offset: number): number {\n if (this.#itemHeight <= 0) return 0;\n const visualIndex = Math.floor(offset / this.#itemHeight);\n // When an item is excluded (same-list drag), visual indices at or past\n // the excluded position map to logical index + 1\n if (this.#excludedIndex >= 0 && visualIndex >= this.#excludedIndex) {\n return visualIndex + 1;\n }\n return visualIndex;\n }\n\n getItemCount(): number {\n return this.#itemCount;\n }\n}\n","/**\n * Cache for measured item heights in dynamic virtual scrolling.\n *\n * Tracks heights by trackBy key (survives reordering). Maintains a cumulative\n * offset prefix-sum array, lazily rebuilt on height change. Binary search\n * O(log N) for scroll-to-index lookups.\n *\n * This is a plain class (not a service) — one instance per virtual scroll.\n */\nexport class HeightCache {\n /** Estimated height used for unmeasured items */\n readonly #estimatedHeight: number;\n\n /** Map from trackBy key to measured height */\n readonly #heightsByKey = new Map<unknown, number>();\n\n /** Current ordered list of trackBy keys (index-aligned with item array) */\n #keys: unknown[] = [];\n\n /** Prefix sums: offsets[i] = cumulative height of items 0..i-1 */\n #offsets: number[] = [];\n\n /** Whether offsets need to be rebuilt */\n #dirty = true;\n\n /** Index excluded during same-list drag (-1 = none) */\n #excludedIndex = -1;\n\n constructor(estimatedHeight: number) {\n this.#estimatedHeight = estimatedHeight;\n }\n\n /** Number of measured items */\n get measuredCount(): number {\n return this.#heightsByKey.size;\n }\n\n /** Number of logical items in the cache */\n get itemCount(): number {\n return this.#keys.length;\n }\n\n /**\n * Update the ordered list of trackBy keys.\n * This must be called whenever items change order or the array changes.\n */\n setKeys(keys: unknown[]): boolean {\n const sameOrder =\n keys.length === this.#keys.length &&\n keys.every((key, index) => Object.is(key, this.#keys[index]));\n\n const nextKeySet = new Set(keys);\n let pruned = false;\n for (const key of this.#heightsByKey.keys()) {\n if (!nextKeySet.has(key)) {\n this.#heightsByKey.delete(key);\n pruned = true;\n }\n }\n\n if (sameOrder && !pruned) {\n return false;\n }\n\n this.#keys = keys;\n this.#dirty = true;\n return true;\n }\n\n /**\n * Record a measured height for a trackBy key.\n * @returns true if the height actually changed (triggers version bump)\n */\n setHeight(key: unknown, height: number): boolean {\n const existing = this.#heightsByKey.get(key);\n if (existing === height) return false;\n this.#heightsByKey.set(key, height);\n this.#dirty = true;\n return true;\n }\n\n /**\n * Get the height for a specific index.\n * Returns measured height if available, otherwise the estimated height.\n */\n getHeight(index: number): number {\n if (index < 0 || index >= this.#keys.length) return this.#estimatedHeight;\n const key = this.#keys[index];\n return this.#heightsByKey.get(key) ?? this.#estimatedHeight;\n }\n\n /**\n * Get the pixel offset (top position) for a given item index.\n * Accounts for the excluded index during same-list drag.\n */\n getOffset(index: number): number {\n this.#rebuildIfDirty();\n\n if (this.#excludedIndex < 0) {\n // No exclusion — direct lookup\n return index < this.#offsets.length ? this.#offsets[index] : this.#getTotalHeightRaw();\n }\n\n // With exclusion: subtract the excluded item's height from offsets\n // at or after the excluded index\n if (index <= this.#excludedIndex) {\n return this.#offsets[index] ?? 0;\n }\n\n // index > excludedIndex: offset = raw offset for (index) minus excluded item's height\n const rawOffset =\n index < this.#offsets.length ? this.#offsets[index] : this.#getTotalHeightRaw();\n const excludedHeight = this.getHeight(this.#excludedIndex);\n return rawOffset - excludedHeight;\n }\n\n /**\n * Get total content height for all items.\n * Does NOT exclude the dragged item — the spacer must maintain full height\n * during same-list drag so sibling content (footers etc.) doesn't shift.\n * Uses O(1) prefix-sum lookup when possible.\n */\n getTotalHeight(itemCount: number): number {\n this.#rebuildIfDirty();\n\n if (itemCount <= 0) return 0;\n\n const keyCount = this.#keys.length;\n if (keyCount === 0) return itemCount * this.#estimatedHeight;\n\n if (itemCount >= keyCount) {\n // All known items + estimated for any extras\n return this.#getTotalHeightRaw() + (itemCount - keyCount) * this.#estimatedHeight;\n }\n\n // Partial: prefix sum up to itemCount\n return this.#offsets[itemCount - 1] + this.getHeight(itemCount - 1);\n }\n\n /**\n * Find the first visible index for a given scrollTop.\n * Uses binary search on the prefix-sum offsets (excluding the excluded item).\n */\n findFirstVisibleIndex(scrollTop: number): number {\n this.#rebuildIfDirty();\n\n const count = this.#keys.length;\n if (count === 0) return 0;\n\n // Binary search for the first item whose bottom edge is past scrollTop\n let lo = 0;\n let hi = count - 1;\n let result = 0;\n\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const offset = this.getOffset(mid);\n if (offset <= scrollTop) {\n result = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Count visible items from startIndex within containerHeight.\n */\n getVisibleCount(startIndex: number, containerHeight: number): number {\n if (containerHeight <= 0) return 0;\n\n const count = this.#keys.length;\n let accumulated = 0;\n let visible = 0;\n let stopIndex = count;\n\n for (let i = startIndex; i < count; i++) {\n if (i === this.#excludedIndex) continue;\n accumulated += this.getHeight(i);\n visible++;\n if (accumulated >= containerHeight) {\n stopIndex = i;\n break;\n }\n }\n\n // Add 1 for partially visible items\n if (visible === 0) return 0;\n const hasMoreItems = stopIndex < count - 1;\n return hasMoreItems ? visible + 1 : visible;\n }\n\n /**\n * Find the item index at a given pixel offset.\n * Used for drag index calculations with variable heights.\n */\n findIndexAtOffset(offset: number): number {\n this.#rebuildIfDirty();\n\n const count = this.#keys.length;\n if (count === 0) return 0;\n\n if (!Number.isFinite(offset)) {\n return offset < 0 ? 0 : count;\n }\n\n if (offset <= 0) {\n if (this.#excludedIndex === 0) {\n return count > 1 ? 1 : count;\n }\n return 0;\n }\n\n const excludedIndex = this.#excludedIndex;\n if (excludedIndex < 0 || excludedIndex >= count) {\n return this.#findFirstIndexWithBottomPastOffset(offset, 0, count - 1);\n }\n\n const excludedOffset = this.#offsets[excludedIndex];\n if (offset < excludedOffset && excludedIndex > 0) {\n return this.#findFirstIndexWithBottomPastOffset(offset, 0, excludedIndex - 1);\n }\n\n if (excludedIndex >= count - 1) {\n return count;\n }\n\n const excludedHeight = this.getHeight(excludedIndex);\n return this.#findFirstIndexWithBottomPastOffset(\n offset + excludedHeight,\n excludedIndex + 1,\n count - 1,\n );\n }\n\n /**\n * Set the excluded index for same-list drag.\n */\n setExcludedIndex(index: number | null): boolean {\n const nextIndex = index ?? -1;\n if (this.#excludedIndex === nextIndex) {\n return false;\n }\n\n this.#excludedIndex = nextIndex;\n return true;\n }\n\n /**\n * Find first logical index in [start, end] whose bottom edge is past offset.\n * Returns one-past-end when no match is found.\n */\n #findFirstIndexWithBottomPastOffset(offset: number, start: number, end: number): number {\n if (start > end) {\n return start;\n }\n\n let lo = start;\n let hi = end;\n let result = end + 1;\n\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const midBottom = this.#offsets[mid] + this.getHeight(mid);\n\n if (midBottom > offset) {\n result = mid;\n hi = mid - 1;\n } else {\n lo = mid + 1;\n }\n }\n\n return result;\n }\n\n /** Raw total height without exclusion */\n #getTotalHeightRaw(): number {\n this.#rebuildIfDirty();\n const len = this.#offsets.length;\n if (len === 0) return 0;\n return this.#offsets[len - 1] + this.getHeight(len - 1);\n }\n\n /** Rebuild prefix-sum array if dirty */\n #rebuildIfDirty(): void {\n if (!this.#dirty) return;\n this.#dirty = false;\n\n const count = this.#keys.length;\n if (this.#offsets.length !== count) {\n this.#offsets = new Array<number>(count);\n }\n\n let cumulative = 0;\n for (let i = 0; i < count; i++) {\n this.#offsets[i] = cumulative;\n cumulative += this.getHeight(i);\n }\n }\n}\n","import { signal, type Signal, type WritableSignal } from '@angular/core';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { HeightCache } from '../utils/height-cache';\n\n/**\n * Dynamic-height virtual scroll strategy.\n *\n * Uses a `HeightCache` with prefix-sum offsets and binary search for O(log N)\n * scroll-to-index lookups. Heights are tracked by trackBy key (survive\n * reordering) and auto-measured via ResizeObserver by the directive.\n *\n * The `version` signal bumps whenever heights change, causing dependent\n * computeds to re-evaluate.\n */\nexport class DynamicHeightStrategy implements VirtualScrollStrategy {\n readonly #cache: HeightCache;\n readonly #version: WritableSignal<number> = signal(0);\n\n readonly version: Signal<number> = this.#version.asReadonly();\n\n constructor(estimatedHeight: number) {\n this.#cache = new HeightCache(estimatedHeight);\n }\n\n getTotalHeight(itemCount: number): number {\n // Read version to subscribe to changes\n this.#version();\n return this.#cache.getTotalHeight(itemCount);\n }\n\n getFirstVisibleIndex(scrollTop: number): number {\n this.#version();\n return this.#cache.findFirstVisibleIndex(scrollTop);\n }\n\n getVisibleCount(startIndex: number, containerHeight: number): number {\n this.#version();\n return this.#cache.getVisibleCount(startIndex, containerHeight);\n }\n\n getOffsetForIndex(index: number): number {\n this.#version();\n return this.#cache.getOffset(index);\n }\n\n getItemHeight(index: number): number {\n this.#version();\n return this.#cache.getHeight(index);\n }\n\n setMeasuredHeight(key: unknown, height: number): void {\n const changed = this.#cache.setHeight(key, height);\n if (changed) {\n this.#version.update((v) => v + 1);\n }\n }\n\n setItemKeys(keys: unknown[]): void {\n const changed = this.#cache.setKeys(keys);\n if (changed) {\n this.#version.update((v) => v + 1);\n }\n }\n\n setExcludedIndex(index: number | null): void {\n const changed = this.#cache.setExcludedIndex(index);\n if (changed) {\n this.#version.update((v) => v + 1);\n }\n }\n\n findIndexAtOffset(offset: number): number {\n this.#version();\n return this.#cache.findIndexAtOffset(offset);\n }\n\n getItemCount(): number {\n this.#version();\n return this.#cache.itemCount;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Interface for a scroll container that can be used with VirtualForDirective.\n * Implement this interface to create custom scroll containers.\n *\n * The scrollTop() and containerHeight() methods should return reactive values\n * (internally backed by signals) so that changes trigger re-computation in\n * the virtual scroll directive.\n */\nexport interface VdndScrollContainer {\n /** The native HTML element that handles scrolling */\n readonly nativeElement: HTMLElement;\n\n /** Current scroll position from top in pixels (reactive) */\n scrollTop(): number;\n\n /** Current container height in pixels (reactive) */\n containerHeight(): number;\n\n /** Scroll to a specific position */\n scrollTo(options: ScrollToOptions): void;\n}\n\n/**\n * Injection token for providing a scroll container to VirtualForDirective.\n *\n * Use the `vdndScrollable` directive to provide this token, or implement\n * `VdndScrollContainer` and provide it manually.\n *\n * @example\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </div>\n * ```\n */\nexport const VDND_SCROLL_CONTAINER = new InjectionToken<VdndScrollContainer>(\n 'VDND_SCROLL_CONTAINER'\n);\n","import { InjectionToken } from '@angular/core';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\n\n/**\n * Interface for a virtual viewport that provides wrapper-based positioning.\n * Components implementing this interface provide a content wrapper with\n * GPU-accelerated transform positioning for efficient virtual scrolling.\n */\nexport interface VdndVirtualViewport {\n /** Current scroll position */\n scrollTop(): number;\n\n /** Height of the viewport container */\n containerHeight(): number;\n\n /** Height of each item in pixels */\n itemHeight(): number;\n\n /** Offset for content below headers (page-level scroll scenarios) */\n contentOffset(): number;\n\n /** The native element of the viewport */\n readonly nativeElement: HTMLElement;\n\n /**\n * Called by VirtualForDirective to inform the viewport of the actual\n * first rendered item index (accounting for overscan). The viewport\n * uses this to position the content wrapper correctly.\n */\n setRenderStartIndex(index: number): void;\n\n /**\n * Get the pixel offset for a given item index.\n * Uses the strategy pattern to support both fixed and dynamic heights.\n */\n getOffsetForIndex(index: number): number;\n\n /**\n * The virtual scroll strategy used by this viewport.\n * Available for drag-drop integration and external consumers.\n */\n readonly strategy: VirtualScrollStrategy | null;\n}\n\n/**\n * Injection token for virtual viewport.\n * VirtualForDirective optionally injects this to detect if it's inside\n * a viewport component that handles wrapper-based positioning.\n */\nexport const VDND_VIRTUAL_VIEWPORT = new InjectionToken<VdndVirtualViewport>(\n 'VDND_VIRTUAL_VIEWPORT',\n);\n","import { computed, effect, Injectable, signal } from '@angular/core';\nimport { CursorPosition, DraggedItem, DragState, GrabOffset } from '../models/drag-drop.models';\n\n/**\n * Internal state type without high-frequency fields.\n * `cursorPosition` and `keyboardTargetIndex` are split into dedicated signals\n * so that 60fps cursor updates don't trigger re-evaluation of rarely-changing computeds.\n */\ntype CoreDragState = Omit<DragState, 'cursorPosition' | 'keyboardTargetIndex'>;\n\nconst INITIAL_CORE_STATE: CoreDragState = {\n isDragging: false,\n draggedItem: null,\n sourceDroppableId: null,\n sourceIndex: null,\n activeDroppableId: null,\n placeholderId: null,\n placeholderIndex: null,\n grabOffset: null,\n initialPosition: null,\n lockAxis: null,\n isKeyboardDrag: false,\n};\n\n/**\n * Central service for managing drag-and-drop state.\n * Uses signals for reactive state management.\n *\n * Architecture: High-frequency fields (`cursorPosition`, `keyboardTargetIndex`)\n * are stored in dedicated signals, separate from the core state. This prevents\n * 60fps cursor updates from triggering re-evaluation of the 10+ computeds\n * that only depend on rarely-changing properties (isDragging, draggedItem, etc.).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DragStateService {\n /** Core state signal — contains all rarely-changing properties */\n readonly #state = signal<CoreDragState>(INITIAL_CORE_STATE);\n\n /** High-frequency cursor position — updated at 60fps during pointer drag */\n readonly #cursorPosition = signal<CursorPosition | null>(null);\n\n /** High-frequency keyboard target index — updated on each arrow key press */\n readonly #keyboardTargetIndex = signal<number | null>(null);\n\n /** Flag indicating if the last drag was cancelled (not dropped) */\n readonly #wasCancelled = signal<boolean>(false);\n\n /** Whether the last drag was cancelled (for droppable to check before emitting drop) */\n readonly wasCancelled = this.#wasCancelled.asReadonly();\n\n /** Whether a drag operation is in progress */\n readonly isDragging = computed(() => this.#state().isDragging);\n\n /** The currently dragged item, or null */\n readonly draggedItem = computed(() => this.#state().draggedItem);\n\n /** ID of the currently dragged item, or null (convenience signal for filtering) */\n readonly draggedItemId = computed(() => this.#state().draggedItem?.draggableId ?? null);\n\n /** ID of the droppable where the drag started */\n readonly sourceDroppableId = computed(() => this.#state().sourceDroppableId);\n\n /** Original index of the dragged item in the source list */\n readonly sourceIndex = computed(() => this.#state().sourceIndex);\n\n /** ID of the droppable currently being hovered over */\n readonly activeDroppableId = computed(() => this.#state().activeDroppableId);\n\n /** ID of the item the placeholder should appear before */\n readonly placeholderId = computed(() => this.#state().placeholderId);\n\n /** Index where the placeholder should be inserted */\n readonly placeholderIndex = computed(() => this.#state().placeholderIndex);\n\n /** Current cursor position */\n readonly cursorPosition = this.#cursorPosition.asReadonly();\n\n /** Offset from cursor to element top-left (for maintaining grab position) */\n readonly grabOffset = computed(() => this.#state().grabOffset);\n\n /** Position when drag started (for axis locking) */\n readonly initialPosition = computed(() => this.#state().initialPosition);\n\n /** Axis to lock movement to */\n readonly lockAxis = computed(() => this.#state().lockAxis);\n\n /** Whether this is a keyboard-initiated drag */\n readonly isKeyboardDrag = computed(() => this.#state().isKeyboardDrag);\n\n /** Target index during keyboard navigation */\n readonly keyboardTargetIndex = this.#keyboardTargetIndex.asReadonly();\n\n constructor() {\n // Inject cursor styles once (for consistent grabbing cursor during drag)\n if (typeof document !== 'undefined') {\n const styleId = 'vdnd-cursor-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n body.vdnd-dragging,\n body.vdnd-dragging * {\n cursor: grabbing !important;\n }\n `;\n document.head.appendChild(style);\n }\n }\n\n // Effect to toggle body class during drag\n effect(() => {\n if (typeof document === 'undefined') return;\n const isDragging = this.isDragging();\n document.body.classList.toggle('vdnd-dragging', isDragging);\n });\n }\n\n /**\n * Start a drag operation.\n */\n startDrag(\n item: DraggedItem,\n cursorPosition?: CursorPosition,\n grabOffset?: GrabOffset,\n lockAxis?: 'x' | 'y' | null,\n activeDroppableId?: string | null,\n placeholderId?: string | null,\n placeholderIndex?: number | null,\n sourceIndex?: number | null,\n isKeyboardDrag?: boolean,\n axisLockPosition?: CursorPosition,\n ): void {\n // Reset cancellation flag at start of new drag\n this.#wasCancelled.set(false);\n this.#cursorPosition.set(cursorPosition ?? null);\n this.#keyboardTargetIndex.set(isKeyboardDrag ? (sourceIndex ?? 0) : null);\n this.#state.set({\n isDragging: true,\n draggedItem: item,\n sourceDroppableId: item.droppableId,\n sourceIndex: sourceIndex ?? null,\n activeDroppableId: activeDroppableId ?? null,\n placeholderId: placeholderId ?? null,\n placeholderIndex: placeholderIndex ?? null,\n grabOffset: grabOffset ?? null,\n initialPosition: axisLockPosition ?? cursorPosition ?? null,\n lockAxis: lockAxis ?? null,\n isKeyboardDrag: isKeyboardDrag ?? false,\n });\n }\n\n /**\n * Update the drag position and targets.\n */\n updateDragPosition(update: {\n cursorPosition: CursorPosition;\n activeDroppableId: string | null;\n placeholderId: string | null;\n placeholderIndex: number | null;\n }): void {\n if (!this.#state().isDragging) {\n return;\n }\n\n // Write cursor to dedicated high-frequency signal\n this.#cursorPosition.set(update.cursorPosition);\n\n // Only update core state if droppable/placeholder actually changed\n const current = this.#state();\n if (\n current.activeDroppableId !== update.activeDroppableId ||\n current.placeholderId !== update.placeholderId ||\n current.placeholderIndex !== update.placeholderIndex\n ) {\n this.#state.update((state) => ({\n ...state,\n activeDroppableId: update.activeDroppableId,\n placeholderId: update.placeholderId,\n placeholderIndex: update.placeholderIndex,\n }));\n }\n }\n\n /**\n * Update just the active droppable.\n */\n setActiveDroppable(droppableId: string | null): void {\n if (!this.#state().isDragging) {\n return;\n }\n\n this.#state.update((state) => ({\n ...state,\n activeDroppableId: droppableId,\n }));\n }\n\n /**\n * Update just the placeholder position.\n */\n setPlaceholder(placeholderId: string | null): void {\n if (!this.#state().isDragging) {\n return;\n }\n\n this.#state.update((state) => ({\n ...state,\n placeholderId,\n }));\n }\n\n /**\n * End the drag operation and reset state (normal drop).\n */\n endDrag(): void {\n this.#wasCancelled.set(false);\n this.#cursorPosition.set(null);\n this.#keyboardTargetIndex.set(null);\n this.#state.set(INITIAL_CORE_STATE);\n }\n\n /**\n * Cancel the drag operation (escape key, disabled, etc.).\n */\n cancelDrag(): void {\n this.#wasCancelled.set(true);\n this.#cursorPosition.set(null);\n this.#keyboardTargetIndex.set(null);\n this.#state.set(INITIAL_CORE_STATE);\n }\n\n /**\n * Check if a specific droppable is currently active.\n */\n isDroppableActive(droppableId: string): boolean {\n return this.#state().activeDroppableId === droppableId;\n }\n\n /**\n * Get the current state snapshot (for event creation).\n */\n getStateSnapshot(): DragState {\n return {\n ...this.#state(),\n cursorPosition: this.#cursorPosition(),\n keyboardTargetIndex: this.#keyboardTargetIndex(),\n };\n }\n\n /**\n * Update the keyboard target index (for keyboard drag navigation).\n * Also updates placeholder position to match, applying same-list adjustment.\n */\n setKeyboardTargetIndex(targetIndex: number): void {\n if (!this.#state().isDragging || !this.#state().isKeyboardDrag) {\n return;\n }\n\n const state = this.#state();\n // Same-list adjustment: if target is at or after source, add 1\n // This accounts for the hidden item shifting everything up visually\n const sourceDroppableId = state.draggedItem?.droppableId;\n const activeDroppableId = state.activeDroppableId;\n const isSameList = sourceDroppableId === activeDroppableId;\n const sourceIndex = state.sourceIndex ?? -1;\n\n let placeholderIndex = targetIndex;\n if (isSameList && sourceIndex >= 0 && targetIndex >= sourceIndex) {\n placeholderIndex = targetIndex + 1;\n }\n\n this.#keyboardTargetIndex.set(targetIndex);\n this.#state.update((s) => ({\n ...s,\n placeholderIndex,\n }));\n }\n\n /**\n * Update the active droppable during keyboard navigation (for cross-list moves).\n */\n setKeyboardActiveDroppable(droppableId: string | null, targetIndex: number): void {\n if (!this.#state().isDragging || !this.#state().isKeyboardDrag) {\n return;\n }\n\n const state = this.#state();\n // Same-list adjustment: if moving back to source list and target is at or after source, add 1\n const sourceDroppableId = state.draggedItem?.droppableId;\n const isSameList = sourceDroppableId === droppableId;\n const sourceIndex = state.sourceIndex ?? -1;\n\n let placeholderIndex = targetIndex;\n if (isSameList && sourceIndex >= 0 && targetIndex >= sourceIndex) {\n placeholderIndex = targetIndex + 1;\n }\n\n this.#keyboardTargetIndex.set(targetIndex);\n this.#state.update((s) => ({\n ...s,\n activeDroppableId: droppableId,\n placeholderIndex,\n }));\n }\n}\n","import { Injectable, isDevMode } from '@angular/core';\n\n/**\n * Service for calculating drop positions and finding elements at cursor positions.\n * This is the core algorithm that makes virtual scroll + drag-and-drop work together.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PositionCalculatorService {\n /** Data attribute used to identify droppable elements */\n readonly #DROPPABLE_ID_ATTR = 'data-droppable-id';\n\n /** Data attribute used to identify droppable groups */\n readonly #DROPPABLE_GROUP_ATTR = 'data-droppable-group';\n\n /** Data attribute used to identify draggable elements */\n readonly #DRAGGABLE_ID_ATTR = 'data-draggable-id';\n\n /** Maximum DOM levels to traverse when looking for parent elements */\n readonly #MAX_PARENT_TRAVERSAL = 15;\n\n /**\n * Find the droppable element at a given point.\n *\n * This works by temporarily hiding the dragged element, then using\n * document.elementFromPoint to find what's underneath the cursor.\n *\n * @param x - Cursor X coordinate\n * @param y - Cursor Y coordinate\n * @param draggedElement - The element being dragged (will be temporarily hidden)\n * @param groupName - The drag-and-drop group name to filter by\n * @returns The droppable element, or null if none found\n */\n findDroppableAtPoint(\n x: number,\n y: number,\n draggedElement: HTMLElement,\n groupName: string,\n ): HTMLElement | null {\n // Temporarily hide the dragged element to \"see through\" it\n const originalPointerEvents = draggedElement.style.pointerEvents;\n draggedElement.style.pointerEvents = 'none';\n\n try {\n const elementAtPoint = document.elementFromPoint(x, y);\n if (!elementAtPoint) {\n return null;\n }\n\n return this.getDroppableParent(elementAtPoint as HTMLElement, groupName);\n } finally {\n // Always restore pointer events\n draggedElement.style.pointerEvents = originalPointerEvents;\n }\n }\n\n /**\n * Find the draggable element at a given point.\n *\n * @param x - Cursor X coordinate\n * @param y - Cursor Y coordinate\n * @param draggedElement - The element being dragged (will be temporarily hidden)\n * @returns The draggable element, or null if none found\n */\n findDraggableAtPoint(x: number, y: number, draggedElement: HTMLElement): HTMLElement | null {\n // Temporarily hide the dragged element\n const originalPointerEvents = draggedElement.style.pointerEvents;\n draggedElement.style.pointerEvents = 'none';\n\n try {\n const elementAtPoint = document.elementFromPoint(x, y);\n if (!elementAtPoint) {\n return null;\n }\n\n return this.getDraggableParent(elementAtPoint as HTMLElement);\n } finally {\n draggedElement.style.pointerEvents = originalPointerEvents;\n }\n }\n\n /**\n * Walk up the DOM tree to find a droppable parent element.\n *\n * @param element - Starting element\n * @param groupName - The drag-and-drop group name to filter by\n * @returns The droppable parent element, or null if none found\n */\n getDroppableParent(element: HTMLElement, groupName: string): HTMLElement | null {\n let current: HTMLElement | null = element;\n let count = 0;\n\n while (current && current.tagName !== 'BODY' && count < this.#MAX_PARENT_TRAVERSAL) {\n const foundGroup = current.getAttribute(this.#DROPPABLE_GROUP_ATTR);\n\n if (foundGroup && foundGroup === groupName) {\n return current;\n }\n\n current = current.parentElement;\n count++;\n }\n\n return null;\n }\n\n /**\n * Walk up the DOM tree to find a draggable parent element.\n *\n * @param element - Starting element\n * @returns The draggable parent element, or null if none found\n */\n getDraggableParent(element: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = element;\n let count = 0;\n\n while (current && current.tagName !== 'BODY' && count < this.#MAX_PARENT_TRAVERSAL) {\n const draggableId = current.getAttribute(this.#DRAGGABLE_ID_ATTR);\n\n if (draggableId) {\n return current;\n }\n\n current = current.parentElement;\n count++;\n }\n\n return null;\n }\n\n /**\n * Get the draggable ID from an element.\n */\n getDraggableId(element: HTMLElement): string | null {\n return element.getAttribute(this.#DRAGGABLE_ID_ATTR);\n }\n\n /**\n * Get the droppable ID from an element.\n */\n getDroppableId(element: HTMLElement): string | null {\n return element.getAttribute(this.#DROPPABLE_ID_ATTR);\n }\n\n /**\n * Calculate the drop index based on mathematical position.\n *\n * This is an alternative approach that doesn't require the target element\n * to be in the DOM. Useful when the target might be virtualized away.\n *\n * @param scrollTop - Current scroll position of the container\n * @param cursorY - Cursor Y position (viewport-relative)\n * @param containerTop - Top position of the container (viewport-relative)\n * @param itemHeight - Height of each item\n * @param totalItems - Total number of items in the list\n * @returns The calculated drop index\n */\n calculateDropIndex(\n scrollTop: number,\n cursorY: number,\n containerTop: number,\n itemHeight: number,\n totalItems: number,\n ): number {\n // Calculate the position relative to the container's content\n const relativeY = cursorY - containerTop + scrollTop;\n\n // Calculate which item index this corresponds to\n const index = Math.floor(relativeY / itemHeight);\n\n // Clamp to valid range\n return Math.max(0, Math.min(index, totalItems));\n }\n\n /**\n * Check if a point is within a specific threshold of a container's edge.\n *\n * @param position - Current cursor position\n * @param containerRect - Container's bounding rect\n * @param threshold - Distance from edge to trigger (in pixels)\n * @returns Object indicating which edges are near\n */\n getNearEdge(\n position: { x: number; y: number },\n containerRect: DOMRect,\n threshold: number,\n ): { top: boolean; bottom: boolean; left: boolean; right: boolean } {\n return {\n top: position.y - containerRect.top <= threshold,\n bottom: containerRect.bottom - position.y <= threshold,\n left: position.x - containerRect.left <= threshold,\n right: containerRect.right - position.x <= threshold,\n };\n }\n\n /**\n * Determine if the cursor is inside a container.\n */\n isInsideContainer(position: { x: number; y: number }, containerRect: DOMRect): boolean {\n return (\n position.x >= containerRect.left &&\n position.x <= containerRect.right &&\n position.y >= containerRect.top &&\n position.y <= containerRect.bottom\n );\n }\n\n /**\n * Find an adjacent droppable in the specified direction (left or right).\n * Used for cross-list keyboard navigation.\n *\n * @param currentDroppableId - The ID of the current droppable\n * @param direction - 'left' or 'right'\n * @param groupName - The drag-and-drop group name\n * @returns Object with droppable info, or null if none found\n */\n findAdjacentDroppable(\n currentDroppableId: string,\n direction: 'left' | 'right',\n groupName: string,\n ): { element: HTMLElement; id: string; itemCount: number } | null {\n // Find all droppables in the same group\n const allDroppables = document.querySelectorAll(\n `[${this.#DROPPABLE_GROUP_ATTR}=\"${groupName}\"]`,\n );\n\n if (allDroppables.length <= 1) {\n return null;\n }\n\n // Get bounding rects and IDs, sorted by X position\n const droppableInfos: { element: HTMLElement; id: string; rect: DOMRect }[] = [];\n\n allDroppables.forEach((el) => {\n const htmlEl = el as HTMLElement;\n const id = htmlEl.getAttribute(this.#DROPPABLE_ID_ATTR);\n if (id) {\n droppableInfos.push({\n element: htmlEl,\n id,\n rect: htmlEl.getBoundingClientRect(),\n });\n }\n });\n\n // Sort by X position (left to right)\n droppableInfos.sort((a, b) => a.rect.left - b.rect.left);\n\n // Find current droppable index\n const currentIndex = droppableInfos.findIndex((d) => d.id === currentDroppableId);\n if (currentIndex === -1) {\n return null;\n }\n\n // Get the adjacent droppable\n const targetIndex = direction === 'left' ? currentIndex - 1 : currentIndex + 1;\n if (targetIndex < 0 || targetIndex >= droppableInfos.length) {\n return null;\n }\n\n const target = droppableInfos[targetIndex];\n\n // Get item count from the target droppable\n const itemCount = this.#getDroppableItemCount(target.element);\n\n return {\n element: target.element,\n id: target.id,\n itemCount,\n };\n }\n\n /**\n * Get the total item count in a droppable.\n * Uses spacer height and data attributes if available, otherwise counts DOM elements.\n */\n #getDroppableItemCount(droppableElement: HTMLElement): number {\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n if (virtualScroll) {\n const configuredHeight = virtualScroll.getAttribute('data-item-height');\n\n if (!configuredHeight) {\n if (isDevMode()) {\n console.error(\n '[ngx-virtual-dnd] vdnd-virtual-scroll requires data-item-height attribute ' +\n 'for keyboard navigation. Cross-list keyboard drag will not work correctly.',\n );\n }\n // Short-circuit: return 0 to prevent navigation to this droppable\n return 0;\n }\n\n // Prefer spacer height over scrollHeight for accuracy\n const spacer = virtualScroll.querySelector(\n '.vdnd-virtual-scroll-spacer',\n ) as HTMLElement | null;\n const totalHeight = spacer\n ? parseFloat(spacer.style.height) || 0\n : (virtualScroll as HTMLElement).scrollHeight;\n\n const itemHeight = parseInt(configuredHeight, 10);\n return Math.floor(totalHeight / itemHeight);\n }\n // Fallback for non-virtual scroll: DOM count is valid\n return droppableElement.querySelectorAll(`[${this.#DRAGGABLE_ID_ATTR}]`).length;\n }\n}\n","import { inject, Injectable, NgZone } from '@angular/core';\nimport { CursorPosition } from '../models/drag-drop.models';\nimport { DragStateService } from './drag-state.service';\nimport { PositionCalculatorService } from './position-calculator.service';\n\n/**\n * Configuration for auto-scroll behavior.\n */\nexport interface AutoScrollConfig {\n /** Distance from edge to start scrolling (in pixels) */\n threshold: number;\n /** Maximum scroll speed (in pixels per frame) */\n maxSpeed: number;\n /** Whether to accelerate scroll based on distance from edge */\n accelerate: boolean;\n}\n\n/**\n * Default auto-scroll configuration.\n */\nconst DEFAULT_CONFIG: AutoScrollConfig = {\n threshold: 50,\n maxSpeed: 15,\n accelerate: true,\n};\n\n/**\n * Service that handles auto-scrolling when dragging near container edges.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AutoScrollService {\n readonly #dragState = inject(DragStateService);\n readonly #positionCalculator = inject(PositionCalculatorService);\n readonly #ngZone = inject(NgZone);\n\n /** Currently registered scrollable containers */\n #scrollableContainers = new Map<\n string,\n {\n element: HTMLElement;\n config: AutoScrollConfig;\n }\n >();\n\n /** Active animation frame ID */\n #animationFrameId: number | null = null;\n\n /** Callback to invoke when scrolling occurs (for placeholder recalculation) */\n #onScrollCallback: (() => void) | null = null;\n\n /** Optional cursor position override for edge detection (bypasses DragState read) */\n #cursorOverride: CursorPosition | null = null;\n\n /** Current scroll state */\n #scrollState: {\n containerId: string | null;\n direction: { x: number; y: number };\n speed: number;\n } = {\n containerId: null,\n direction: { x: 0, y: 0 },\n speed: 0,\n };\n\n /**\n * Register a scrollable container for auto-scrolling.\n */\n registerContainer(\n id: string,\n element: HTMLElement,\n config: Partial<AutoScrollConfig> = {},\n ): void {\n this.#scrollableContainers.set(id, {\n element,\n config: { ...DEFAULT_CONFIG, ...config },\n });\n }\n\n /**\n * Unregister a scrollable container.\n */\n unregisterContainer(id: string): void {\n this.#scrollableContainers.delete(id);\n }\n\n /**\n * Start monitoring for auto-scroll.\n * Call this when a drag starts.\n * @param onScroll Optional callback to invoke when scrolling occurs (for placeholder recalculation)\n */\n startMonitoring(onScroll?: () => void): void {\n if (this.#animationFrameId !== null) {\n return;\n }\n\n this.#onScrollCallback = onScroll ?? null;\n\n this.#ngZone.runOutsideAngular(() => {\n this.#tick();\n });\n }\n\n /**\n * Stop monitoring for auto-scroll.\n * Call this when a drag ends.\n */\n stopMonitoring(): void {\n if (this.#animationFrameId !== null) {\n cancelAnimationFrame(this.#animationFrameId);\n this.#animationFrameId = null;\n }\n\n this.#onScrollCallback = null;\n this.#cursorOverride = null;\n this.#scrollState = {\n containerId: null,\n direction: { x: 0, y: 0 },\n speed: 0,\n };\n }\n\n /**\n * Override the cursor position used for edge detection.\n * When set, #tick() uses this instead of DragStateService.cursorPosition().\n * Used by constrainToContainer to provide a position without grabOffset distortion.\n * @internal\n */\n setCursorOverride(position: CursorPosition): void {\n this.#cursorOverride = position;\n }\n\n /**\n * Animation tick - check cursor position and scroll if needed.\n */\n #tick(): void {\n const cursor = this.#cursorOverride ?? this.#dragState.cursorPosition();\n const isDragging = this.#dragState.isDragging();\n\n // Stop monitoring if drag ended\n if (!isDragging) {\n this.stopMonitoring();\n return;\n }\n\n // Skip this frame if no cursor position yet, but continue monitoring\n if (!cursor) {\n this.#animationFrameId = requestAnimationFrame(() => this.#tick());\n return;\n }\n\n let scrollPerformed = false;\n\n // Check each container\n for (const [id, { element, config }] of this.#scrollableContainers) {\n const rect = element.getBoundingClientRect();\n\n // Check if cursor is inside this container\n const isInside = this.#positionCalculator.isInsideContainer(cursor, rect);\n\n if (!isInside) {\n continue;\n }\n\n // Check edges\n const nearEdge = this.#positionCalculator.getNearEdge(cursor, rect, config.threshold);\n\n // Calculate scroll direction and speed\n const direction = { x: 0, y: 0 };\n let maxDistance = 0;\n\n if (nearEdge.top) {\n direction.y = -1;\n maxDistance = Math.max(maxDistance, config.threshold - (cursor.y - rect.top));\n } else if (nearEdge.bottom) {\n direction.y = 1;\n maxDistance = Math.max(maxDistance, config.threshold - (rect.bottom - cursor.y));\n }\n\n if (nearEdge.left) {\n direction.x = -1;\n maxDistance = Math.max(maxDistance, config.threshold - (cursor.x - rect.left));\n } else if (nearEdge.right) {\n direction.x = 1;\n maxDistance = Math.max(maxDistance, config.threshold - (rect.right - cursor.x));\n }\n\n // If near an edge, start scrolling\n if (direction.x !== 0 || direction.y !== 0) {\n // Calculate speed (accelerate based on distance from edge)\n let speed = config.maxSpeed;\n if (config.accelerate) {\n const distanceRatio = maxDistance / config.threshold;\n speed = Math.min(config.maxSpeed, Math.max(1, config.maxSpeed * distanceRatio));\n }\n\n this.#scrollState = { containerId: id, direction, speed };\n this.#performScroll(element, direction, speed);\n scrollPerformed = true;\n break;\n }\n }\n\n // Reset scroll state if no scrolling was performed\n if (!scrollPerformed) {\n this.#scrollState = {\n containerId: null,\n direction: { x: 0, y: 0 },\n speed: 0,\n };\n }\n\n this.#animationFrameId = requestAnimationFrame(() => this.#tick());\n }\n\n /**\n * Perform the actual scroll operation.\n */\n #performScroll(element: HTMLElement, direction: { x: number; y: number }, speed: number): void {\n const scrollX = direction.x * speed;\n const scrollY = direction.y * speed;\n\n // Check bounds before scrolling\n const maxScrollY = element.scrollHeight - element.clientHeight;\n const maxScrollX = element.scrollWidth - element.clientWidth;\n\n if (direction.y < 0 && element.scrollTop <= 0) {\n return;\n }\n if (direction.y > 0 && element.scrollTop >= maxScrollY) {\n return;\n }\n if (direction.x < 0 && element.scrollLeft <= 0) {\n return;\n }\n if (direction.x > 0 && element.scrollLeft >= maxScrollX) {\n return;\n }\n\n // Use direct property assignment for guaranteed synchronous scroll\n // scrollBy() with 'instant' behavior may have async issues in Safari\n if (scrollY !== 0) {\n element.scrollTop += scrollY;\n }\n if (scrollX !== 0) {\n element.scrollLeft += scrollX;\n }\n\n // Notify callback IMMEDIATELY in the same frame (no RAF delay)\n // Delaying via RAF causes cumulative drift during continuous autoscroll\n // because multiple scrolls happen before each delayed callback runs.\n // Note: No ngZone.run() needed here - the callback (DraggableDirective.#recalculatePlaceholder)\n // already enters the zone when updating drag state.\n this.#onScrollCallback?.();\n }\n\n /**\n * Check if auto-scrolling is currently active.\n */\n isScrolling(): boolean {\n return (\n this.#scrollState.containerId !== null &&\n (this.#scrollState.direction.x !== 0 || this.#scrollState.direction.y !== 0)\n );\n }\n\n /**\n * Get the current scroll direction.\n */\n getScrollDirection(): { x: number; y: number } {\n return this.#scrollState.direction;\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Service for cloning DOM elements with their computed styles.\n * Used to create visual copies of dragged elements for the drag preview.\n */\n@Injectable({ providedIn: 'root' })\nexport class ElementCloneService {\n /**\n * CSS properties to copy from source to clone.\n * These are the visual properties that affect appearance.\n */\n readonly #stylesToCopy = [\n 'background',\n 'backgroundColor',\n 'backgroundImage',\n 'border',\n 'borderRadius',\n 'boxShadow',\n 'color',\n 'font',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'lineHeight',\n 'padding',\n 'margin',\n 'display',\n 'flexDirection',\n 'alignItems',\n 'justifyContent',\n 'gap',\n 'textAlign',\n 'textDecoration',\n 'width',\n 'height',\n 'minWidth',\n 'minHeight',\n 'maxWidth',\n 'maxHeight',\n 'overflow',\n 'opacity',\n 'transform',\n 'boxSizing',\n ];\n\n /**\n * Clone an element with its computed styles.\n * Returns an HTMLElement ready for use as a drag preview.\n */\n cloneElement(source: HTMLElement): HTMLElement {\n const clone = source.cloneNode(true) as HTMLElement;\n\n // Apply computed styles as inline styles\n this.#applyComputedStyles(source, clone);\n\n // Handle special elements (canvas, video, etc.)\n this.#handleSpecialElements(source, clone);\n\n // Sanitize the clone for safe use as preview\n this.#sanitizeClone(clone);\n\n return clone;\n }\n\n /**\n * Apply computed styles from source to target element.\n * Recursively applies to all child elements.\n */\n #applyComputedStyles(source: HTMLElement, target: HTMLElement): void {\n const computed = window.getComputedStyle(source);\n\n // Copy essential visual properties\n for (const prop of this.#stylesToCopy) {\n const value = computed.getPropertyValue(this.#camelToKebab(prop));\n if (value) {\n target.style.setProperty(this.#camelToKebab(prop), value);\n }\n }\n\n // Disable animations and transitions on clone\n target.style.animation = 'none';\n target.style.transition = 'none';\n\n // Recursively apply to children\n const sourceChildren = source.children;\n const targetChildren = target.children;\n\n for (let i = 0; i < sourceChildren.length && i < targetChildren.length; i++) {\n const sourceChild = sourceChildren[i];\n const targetChild = targetChildren[i];\n\n if (sourceChild instanceof HTMLElement && targetChild instanceof HTMLElement) {\n this.#applyComputedStyles(sourceChild, targetChild);\n }\n }\n }\n\n /**\n * Handle special elements that require extra processing.\n */\n #handleSpecialElements(source: HTMLElement, clone: HTMLElement): void {\n // Handle canvas elements - copy current content\n const sourceCanvases = source.querySelectorAll('canvas');\n const cloneCanvases = clone.querySelectorAll('canvas');\n\n sourceCanvases.forEach((srcCanvas, i) => {\n const cloneCanvas = cloneCanvases[i] as HTMLCanvasElement;\n if (cloneCanvas) {\n const ctx = cloneCanvas.getContext('2d');\n if (ctx) {\n cloneCanvas.width = srcCanvas.width;\n cloneCanvas.height = srcCanvas.height;\n ctx.drawImage(srcCanvas, 0, 0);\n }\n }\n });\n\n // Handle video elements - replace with poster or placeholder\n const videos = clone.querySelectorAll('video');\n videos.forEach((video) => {\n const poster = video.poster;\n if (poster) {\n const img = document.createElement('img');\n img.src = poster;\n img.style.width = '100%';\n img.style.height = '100%';\n img.style.objectFit = 'cover';\n video.replaceWith(img);\n } else {\n // Create a placeholder\n const placeholder = document.createElement('div');\n placeholder.style.cssText = `\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n video.replaceWith(placeholder);\n }\n });\n\n // Handle iframes - replace with placeholder\n const iframes = clone.querySelectorAll('iframe');\n iframes.forEach((iframe) => {\n const placeholder = document.createElement('div');\n const iframeStyles = window.getComputedStyle(iframe);\n placeholder.style.width = iframeStyles.width;\n placeholder.style.height = iframeStyles.height;\n placeholder.style.display = 'flex';\n placeholder.style.alignItems = 'center';\n placeholder.style.justifyContent = 'center';\n iframe.replaceWith(placeholder);\n });\n }\n\n /**\n * Sanitize the clone to prevent interaction issues.\n */\n #sanitizeClone(clone: HTMLElement): void {\n // Remove draggable directive attributes\n clone.removeAttribute('vdndDraggable');\n clone.removeAttribute('data-draggable-id');\n clone.removeAttribute('data-droppable-id');\n\n // Remove Angular-specific attributes\n const angularAttrs = Array.from(clone.attributes).filter(\n (attr) => attr.name.startsWith('ng-') || attr.name.startsWith('_ng'),\n );\n angularAttrs.forEach((attr) => clone.removeAttribute(attr.name));\n\n // Process all descendant elements\n const allElements = clone.querySelectorAll('*');\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n\n // Remove event-related attributes\n const attrs = Array.from(el.attributes);\n attrs.forEach((attr) => {\n if (\n attr.name.startsWith('on') ||\n attr.name.startsWith('(') ||\n attr.name.startsWith('ng-') ||\n attr.name.startsWith('_ng')\n ) {\n el.removeAttribute(attr.name);\n }\n });\n\n // Remove draggable attributes from children too\n el.removeAttribute('vdndDraggable');\n el.removeAttribute('data-draggable-id');\n el.removeAttribute('data-droppable-id');\n });\n\n // Disable interactive elements\n const interactiveElements = clone.querySelectorAll(\n 'button, input, textarea, select, a, [contenteditable]',\n );\n interactiveElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.pointerEvents = 'none';\n el.setAttribute('tabindex', '-1');\n el.setAttribute('aria-hidden', 'true');\n el.setAttribute('disabled', 'true');\n }\n });\n\n // Remove focus styling classes that might interfere\n clone.classList.remove('vdnd-draggable-dragging');\n clone.classList.remove('vdnd-draggable-disabled');\n }\n\n /**\n * Convert camelCase to kebab-case for CSS properties.\n */\n #camelToKebab(str: string): string {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { DragStateService } from './drag-state.service';\nimport { DraggedItem, END_OF_LIST, GrabOffset } from '../models/drag-drop.models';\n\n/**\n * Service for managing keyboard-initiated drag operations.\n * Works in conjunction with DragStateService to provide keyboard drag functionality.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardDragService {\n readonly #dragState = inject(DragStateService);\n\n /** Total item count for the current droppable (set by droppable on keyboard drag start) */\n readonly #totalItemCount = signal<number>(0);\n\n /** Whether a keyboard drag is currently active */\n readonly isActive = computed(\n () => this.#dragState.isKeyboardDrag() && this.#dragState.isDragging(),\n );\n\n /** Current target index during keyboard navigation */\n readonly targetIndex = computed(() => this.#dragState.keyboardTargetIndex());\n\n /** Source index where the drag started */\n readonly sourceIndex = computed(() => this.#dragState.sourceIndex());\n\n /** Current active droppable ID */\n readonly activeDroppableId = computed(() => this.#dragState.activeDroppableId());\n\n /**\n * Start a keyboard drag operation.\n */\n startKeyboardDrag(\n item: DraggedItem,\n sourceIndex: number,\n totalItemCount: number,\n activeDroppableId: string,\n ): void {\n this.#totalItemCount.set(totalItemCount);\n\n // For keyboard drag, we position the preview at the element's location\n // We use a grab offset of 0,0 since we're not grabbing at a specific point\n const grabOffset: GrabOffset = { x: 0, y: 0 };\n\n // Get the element's position for the cursor position\n // This positions the preview at the element's original location\n const rect = item.element.getBoundingClientRect();\n const cursorPosition = { x: rect.left, y: rect.top };\n\n // Same-list adjustment: at start, targetIndex equals sourceIndex\n // Since sourceIndex >= sourceIndex is always true, add 1 to placeholderIndex\n // This accounts for the hidden item shifting everything up visually\n const initialPlaceholderIndex = sourceIndex + 1;\n\n this.#dragState.startDrag(\n item,\n cursorPosition,\n grabOffset,\n null, // no axis lock for keyboard drag\n activeDroppableId,\n END_OF_LIST,\n initialPlaceholderIndex,\n sourceIndex,\n true, // isKeyboardDrag\n );\n }\n\n /**\n * Move to a specific index during keyboard drag.\n * Returns the clamped target index.\n */\n moveToIndex(targetIndex: number): number {\n if (!this.isActive()) {\n return targetIndex;\n }\n\n const totalItems = this.#totalItemCount();\n const clampedIndex = Math.max(0, Math.min(targetIndex, totalItems));\n\n this.#dragState.setKeyboardTargetIndex(clampedIndex);\n\n return clampedIndex;\n }\n\n /**\n * Move up by one position (ArrowUp).\n * Returns the new target index.\n */\n moveUp(): number {\n const currentTarget = this.targetIndex() ?? 0;\n return this.moveToIndex(currentTarget - 1);\n }\n\n /**\n * Move down by one position (ArrowDown).\n * Returns the new target index.\n */\n moveDown(): number {\n const currentTarget = this.targetIndex() ?? 0;\n return this.moveToIndex(currentTarget + 1);\n }\n\n /**\n * Move to an adjacent droppable (ArrowLeft/ArrowRight).\n * The droppable registry is managed externally.\n */\n moveToDroppable(droppableId: string, targetIndex: number, totalItemCount: number): void {\n if (!this.isActive()) {\n return;\n }\n\n this.#totalItemCount.set(totalItemCount);\n const clampedIndex = Math.max(0, Math.min(targetIndex, totalItemCount));\n this.#dragState.setKeyboardActiveDroppable(droppableId, clampedIndex);\n }\n\n /**\n * Complete the keyboard drag (Space or Enter to drop).\n */\n completeKeyboardDrag(): void {\n if (!this.isActive()) {\n return;\n }\n\n this.#dragState.endDrag();\n }\n\n /**\n * Cancel the keyboard drag (Escape).\n */\n cancelKeyboardDrag(): void {\n if (!this.isActive()) {\n return;\n }\n\n this.#dragState.cancelDrag();\n }\n\n /**\n * Update the total item count (when navigating to a new list).\n */\n setTotalItemCount(count: number): void {\n this.#totalItemCount.set(count);\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\n\n/**\n * Service that manages a shared overlay container appended to `document.body`.\n *\n * Elements placed inside the overlay container escape any ancestor CSS `transform`,\n * `perspective`, or `filter` that would create a new containing block for\n * `position: fixed` children. This ensures viewport-relative positioning works\n * correctly regardless of where the consuming component sits in the DOM tree.\n *\n * Mirrors the strategy used by Angular CDK's `OverlayContainer`.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class OverlayContainerService implements OnDestroy {\n #containerElement: HTMLElement | null = null;\n\n /**\n * Returns the shared overlay container element, lazily creating it on first access.\n * Returns `null` in non-browser environments (SSR).\n */\n getContainerElement(): HTMLElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (!this.#containerElement) {\n this.#containerElement = document.createElement('div');\n this.#containerElement.classList.add('vdnd-overlay-container');\n document.body.appendChild(this.#containerElement);\n }\n\n return this.#containerElement;\n }\n\n ngOnDestroy(): void {\n this.#containerElement?.remove();\n this.#containerElement = null;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { type CursorPosition, END_OF_LIST, type GrabOffset } from '../models/drag-drop.models';\nimport { PositionCalculatorService } from './position-calculator.service';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DragIndexCalculatorService {\n readonly #positionCalculator = inject(PositionCalculatorService);\n\n /** Registered strategies by droppable ID */\n readonly #strategies = new Map<string, VirtualScrollStrategy>();\n\n /**\n * Register a virtual scroll strategy for a droppable.\n * Used by virtual scroll components to provide dynamic height lookups.\n */\n registerStrategy(droppableId: string, strategy: VirtualScrollStrategy): void {\n this.#strategies.set(droppableId, strategy);\n }\n\n /**\n * Unregister a strategy when the droppable is destroyed.\n */\n unregisterStrategy(droppableId: string): void {\n this.#strategies.delete(droppableId);\n }\n\n /**\n * Get the registered strategy for a droppable ID.\n * Used by draggable to calculate source index with variable heights.\n */\n getStrategyForDroppable(droppableId: string): VirtualScrollStrategy | undefined {\n return this.#strategies.get(droppableId);\n }\n\n getTotalItemCount(args: {\n droppableElement: HTMLElement;\n isSameList: boolean;\n draggedItemHeight: number;\n }): number {\n return this.#getTotalItemCount(args.droppableElement, args.isSameList, args.draggedItemHeight);\n }\n\n calculatePlaceholderIndex(args: {\n droppableElement: HTMLElement;\n position: CursorPosition;\n previousPosition: CursorPosition | null;\n grabOffset: GrabOffset | null;\n draggedItemHeight: number;\n sourceDroppableId: string | null;\n sourceIndex: number | null;\n }): { index: number; placeholderId: string } {\n const {\n droppableElement,\n position,\n grabOffset,\n draggedItemHeight,\n sourceDroppableId,\n sourceIndex,\n } = args;\n\n // Get container and measurements - handle both embedded virtual-scroll and page-level scroll\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n const virtualContent = droppableElement.matches('vdnd-virtual-content')\n ? droppableElement\n : droppableElement.closest('vdnd-virtual-content');\n\n let container: HTMLElement;\n let currentScrollTop: number;\n let rect: DOMRect;\n\n if (virtualScroll) {\n // Standard virtual scroll component - scroll container is the virtual scroll element\n container = virtualScroll as HTMLElement;\n rect = container.getBoundingClientRect();\n currentScrollTop = container.scrollTop;\n } else if (virtualContent) {\n // Page-level scroll: find scrollable parent and get adjusted scroll\n const scrollableParent = virtualContent.closest('.vdnd-scrollable') as HTMLElement | null;\n if (scrollableParent) {\n container = scrollableParent;\n // Use scroll container rect + content offset to avoid stale virtualContent rects.\n rect = container.getBoundingClientRect();\n const contentOffsetAttr = (virtualContent as HTMLElement).getAttribute(\n 'data-content-offset',\n );\n const contentOffset = contentOffsetAttr ? parseFloat(contentOffsetAttr) : 0;\n const offsetValue = Number.isFinite(contentOffset) ? contentOffset : 0;\n currentScrollTop = container.scrollTop - offsetValue;\n } else {\n container = virtualContent as HTMLElement;\n rect = container.getBoundingClientRect();\n currentScrollTop = 0;\n }\n } else {\n // Fallback: use droppable element directly\n container = droppableElement;\n rect = container.getBoundingClientRect();\n currentScrollTop = container.scrollTop;\n }\n\n // Check if a registered strategy exists for this droppable\n const currentDroppableId = this.#positionCalculator.getDroppableId(droppableElement);\n const strategy = (currentDroppableId ? this.#strategies.get(currentDroppableId) : null) ?? null;\n\n // Prefer configured item height from virtual scroll/content over actual element height.\n // This prevents drift when actual element height differs from grid spacing.\n const configuredHeight =\n virtualScroll?.getAttribute('data-item-height') ??\n (virtualContent as HTMLElement | null)?.getAttribute('data-item-height');\n const parsedHeight = configuredHeight ? parseFloat(configuredHeight) : Number.NaN;\n const itemHeight = Number.isFinite(parsedHeight)\n ? parsedHeight\n : this.#getDraggedItemHeightFallback(draggedItemHeight, 50);\n\n // Calculate preview center position mathematically\n // The preview is positioned at: cursorPosition - grabOffset (see drag-preview.component.ts)\n // So preview center = cursorPosition.y - grabOffset.y + previewHeight/2\n // Using math avoids Safari's stale getBoundingClientRect() issue during autoscroll\n // Use actual dragged item height when available (important for dynamic heights)\n const previewHeight = this.#getDraggedItemHeightFallback(draggedItemHeight, itemHeight);\n const previewTopY = position.y - (grabOffset?.y ?? 0);\n const previewBottomY = previewTopY + previewHeight;\n const previewCenterY = previewTopY + previewHeight / 2;\n const isConstrainedToContainer = droppableElement.hasAttribute('data-constrain-to-container');\n\n // Capped center probe: use preview center but limit how deep the probe reaches.\n // The cap prevents a tall preview (e.g. 120px among 60px items) from overshooting\n // multiple positions — the center would land 2+ items away, but the cap keeps it\n // within one item of the top edge.\n const indexProbeY = Math.min(previewCenterY, previewTopY + itemHeight / 2);\n\n // Convert to visual index\n const relativeY = indexProbeY - rect.top + currentScrollTop;\n\n // Determine same-list drag info before strategy branch\n const isSameList = sourceDroppableId !== null && sourceDroppableId === currentDroppableId;\n const sourceIndexValue = isSameList ? (sourceIndex ?? -1) : -1;\n\n let visualIndex: number;\n if (strategy) {\n visualIndex = strategy.findIndexAtOffset(relativeY);\n\n // Midpoint refinement for variable heights:\n // Only advance past an item when the preview top has crossed its midpoint.\n // Without this, a short preview entering a tall item's range triggers\n // displacement at ~20% overlap, which looks like unnatural overlapping.\n const topRelativeY = previewTopY - rect.top + currentScrollTop;\n const targetTop = strategy.getOffsetForIndex(visualIndex);\n const targetBottom = strategy.getOffsetForIndex(visualIndex + 1);\n const targetMidpoint = (targetTop + targetBottom) / 2;\n if (topRelativeY >= targetMidpoint) {\n visualIndex += 1;\n }\n } else {\n // Fixed height: simple division\n visualIndex = Math.floor(relativeY / itemHeight);\n }\n\n // Same-list +1 adjustment:\n // - No strategy: always adjust when visual index is at/after source\n // - Strategy: adjust only if exclusion has not been applied yet\n // (prevents an off-by-one window during early drag updates)\n let placeholderIndex = visualIndex;\n if (isSameList && sourceIndexValue >= 0 && visualIndex >= sourceIndexValue) {\n const needsAdjustment = !strategy || !this.#isSourceIndexExcluded(strategy, sourceIndexValue);\n if (needsAdjustment) {\n placeholderIndex = visualIndex + 1;\n }\n }\n\n // Get total items for clamping\n const totalItems = this.#getTotalItemCount(droppableElement, isSameList, draggedItemHeight);\n\n // Edge detection: allow dropping at the END of the list when cursor is near bottom edge.\n // Due to max scroll limits, the math alone can't reach totalItems when the list is longer\n // than the viewport. If cursor is in the bottom portion of the container and we're at\n // or past the last visible slot, snap to totalItems.\n const cursorRelativeToBottom = rect.bottom - previewCenterY;\n const isNearBottomEdge = cursorRelativeToBottom < itemHeight;\n if (isNearBottomEdge && placeholderIndex >= totalItems - 1) {\n placeholderIndex = totalItems;\n }\n\n // When the preview is constrained to the container bounds, large dragged items can\n // cover the first/last slots while their center never reaches them. Snap to edges\n // using preview bounds so top/bottom drops remain reachable.\n if (isConstrainedToContainer) {\n const droppableRect = droppableElement.getBoundingClientRect();\n const edgeTolerance = 2;\n const distanceToTop = Math.abs(previewTopY - droppableRect.top);\n const distanceToBottom = Math.abs(droppableRect.bottom - previewBottomY);\n\n if (distanceToTop <= edgeTolerance && distanceToTop <= distanceToBottom) {\n placeholderIndex = 0;\n } else if (distanceToBottom <= edgeTolerance) {\n placeholderIndex = totalItems;\n }\n }\n\n // Clamp to valid range\n placeholderIndex = Math.max(0, Math.min(placeholderIndex, totalItems));\n\n return { index: placeholderIndex, placeholderId: END_OF_LIST };\n }\n\n #getTotalItemCount(\n droppableElement: HTMLElement,\n isSameList: boolean,\n draggedItemHeight: number,\n ): number {\n // Check if a registered strategy exists\n const droppableId = this.#positionCalculator.getDroppableId(droppableElement);\n const strategy = droppableId ? this.#strategies.get(droppableId) : null;\n const strategyItemCount = strategy?.getItemCount();\n if (strategyItemCount !== undefined && Number.isFinite(strategyItemCount)) {\n return Math.max(0, strategyItemCount);\n }\n\n // Check for embedded virtual scroll component\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n if (virtualScroll) {\n // Use data-total-items attribute if available (always the true N)\n const totalItemsAttr = virtualScroll.getAttribute('data-total-items');\n if (totalItemsAttr) {\n const count = parseInt(totalItemsAttr, 10);\n if (Number.isFinite(count)) {\n return count;\n }\n }\n\n // Fallback: Use the spacer's height, NOT scrollHeight, to determine item count.\n // scrollHeight can be inflated by absolutely-positioned elements like the placeholder.\n const spacer = virtualScroll.querySelector(\n '.vdnd-virtual-scroll-spacer',\n ) as HTMLElement | null;\n const configuredHeight = virtualScroll.getAttribute('data-item-height');\n const itemHeight = configuredHeight\n ? parseInt(configuredHeight, 10)\n : this.#getDraggedItemHeightFallback(draggedItemHeight, 50);\n\n let totalHeight: number;\n if (spacer) {\n // Get the spacer's explicit height (set via Angular binding)\n totalHeight = parseFloat(spacer.style.height) || 0;\n } else {\n // Fallback: use scrollHeight if spacer not found\n totalHeight = (virtualScroll as HTMLElement).scrollHeight;\n }\n\n // When strategy exists, spacer height already accounts for exclusion.\n // Don't apply same-list +1 adjustment — strategy handles it.\n if (strategy) {\n const count = Math.round(totalHeight / itemHeight);\n return count;\n }\n\n // Spacer height reflects full N items (getTotalHeight no longer excludes)\n const count = Math.floor(totalHeight / itemHeight);\n return count;\n }\n\n // Check for page-level scroll (vdnd-virtual-content)\n const virtualContent = droppableElement.matches('vdnd-virtual-content')\n ? droppableElement\n : droppableElement.closest('vdnd-virtual-content');\n if (virtualContent) {\n // Prefer explicit total items attribute (works for both fixed and dynamic heights)\n const totalItemsAttr = (virtualContent as HTMLElement).getAttribute('data-total-items');\n if (totalItemsAttr) {\n const count = parseInt(totalItemsAttr, 10);\n if (Number.isFinite(count)) {\n // data-total-items is the true total N (derived from strategy item count)\n return count;\n }\n }\n\n // Fallback: use spacer height to determine total items\n const spacer = virtualContent.querySelector('.vdnd-content-spacer') as HTMLElement | null;\n if (spacer) {\n const totalHeight = parseFloat(spacer.style.height) || 0;\n const configuredHeight = virtualContent.getAttribute('data-item-height');\n const itemHeight = configuredHeight\n ? parseInt(configuredHeight, 10)\n : this.#getDraggedItemHeightFallback(draggedItemHeight, 72);\n return Math.floor(totalHeight / itemHeight);\n }\n }\n\n // Fallback for non-virtual scroll — querySelectorAll finds all N items\n // (including the hidden dragged item), so no adjustment needed\n const items = droppableElement.querySelectorAll('[data-draggable-id]');\n return items.length;\n }\n\n #getDraggedItemHeightFallback(height: number, fallback: number): number {\n return Number.isFinite(height) && height > 0 ? height : fallback;\n }\n\n /**\n * Detect whether a strategy has already excluded the source index.\n *\n * With exclusion applied, the source slot collapses in visual space:\n * offset(sourceIndex + 1) <= offset(sourceIndex). Without exclusion,\n * the next offset is strictly greater.\n */\n #isSourceIndexExcluded(strategy: VirtualScrollStrategy, sourceIndex: number): boolean {\n if (sourceIndex < 0) {\n return false;\n }\n\n const sourceOffset = strategy.getOffsetForIndex(sourceIndex);\n const nextOffset = strategy.getOffsetForIndex(sourceIndex + 1);\n\n return nextOffset <= sourceOffset;\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Renders an empty placeholder that takes up space in the document flow.\n *\n * This component is used internally by virtual scroll containers to show\n * where an item will be dropped. It's rendered inline with items and\n * takes up the same vertical space as an item.\n *\n * The placeholder is just empty space - no borders, no background.\n * Consumers can style it via CSS if desired.\n */\n@Component({\n selector: 'vdnd-drag-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'vdnd-drag-placeholder vdnd-drag-placeholder-visible',\n '[style.height.px]': 'itemHeight()',\n },\n styles: `\n :host {\n display: block;\n pointer-events: none;\n }\n `,\n template: ``,\n})\nexport class DragPlaceholderComponent {\n /** Item height for sizing */\n itemHeight = input.required<number>();\n}\n","import { NgZone, type WritableSignal } from '@angular/core';\n\nexport function bindRafThrottledScrollTopSignal(options: {\n element: HTMLElement;\n ngZone: NgZone;\n scrollTop: WritableSignal<number>;\n thresholdPx?: number;\n onCommit?: (scrollTop: number) => void;\n}): () => void {\n const { element, ngZone, scrollTop, thresholdPx = 5, onCommit } = options;\n\n let pendingRaf: number | null = null;\n let lastCommittedScrollTop = element.scrollTop;\n\n const onScroll = () => {\n if (pendingRaf !== null) {\n return;\n }\n\n const currentScrollTop = element.scrollTop;\n if (Math.abs(currentScrollTop - lastCommittedScrollTop) < thresholdPx) {\n return;\n }\n\n pendingRaf = requestAnimationFrame(() => {\n pendingRaf = null;\n const finalScrollTop = element.scrollTop;\n if (Math.abs(finalScrollTop - lastCommittedScrollTop) >= thresholdPx) {\n lastCommittedScrollTop = finalScrollTop;\n scrollTop.set(finalScrollTop);\n onCommit?.(finalScrollTop);\n }\n });\n };\n\n ngZone.runOutsideAngular(() => {\n element.addEventListener('scroll', onScroll, { passive: true });\n });\n\n scrollTop.set(lastCommittedScrollTop);\n\n return () => {\n if (pendingRaf !== null) {\n cancelAnimationFrame(pendingRaf);\n pendingRaf = null;\n }\n element.removeEventListener('scroll', onScroll);\n };\n}\n\nexport function bindResizeObserverHeightSignal(options: {\n element: HTMLElement;\n ngZone: NgZone;\n height: WritableSignal<number>;\n minDeltaPx?: number;\n}): () => void {\n const { element, ngZone, height, minDeltaPx = 1 } = options;\n\n if (typeof ResizeObserver === 'undefined') {\n height.set(element.clientHeight);\n return () => undefined;\n }\n\n let observer: ResizeObserver | null = null;\n\n ngZone.runOutsideAngular(() => {\n observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const nextHeight = entry.contentRect.height;\n if (Math.abs(nextHeight - height()) > minDeltaPx) {\n height.set(nextHeight);\n }\n }\n });\n observer.observe(element);\n });\n\n height.set(element.clientHeight);\n\n return () => {\n observer?.disconnect();\n observer = null;\n };\n}\n","import {\n afterNextRender,\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DragStateService } from '../services/drag-state.service';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport { DragPlaceholderComponent } from './drag-placeholder.component';\nimport {\n bindRafThrottledScrollTopSignal,\n bindResizeObserverHeightSignal,\n} from '../utils/dom-signal-bindings';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\n\n/**\n * Context provided to the item template.\n */\nexport interface VirtualScrollItemContext<T> {\n /** The item data */\n $implicit: T;\n /** The item's index in the original array */\n index: number;\n /** Whether this item is \"sticky\" (always rendered) */\n isSticky: boolean;\n}\n\n/**\n * A virtual scroll container that only renders visible items.\n *\n * Key features:\n * - Only renders items within the visible viewport plus an overscan buffer\n * - Supports \"sticky\" items that are always rendered (used for dragged items)\n * - Uses spacer divs to maintain correct scroll height\n * - Integrates with the drag-and-drop system\n * - Automatic height detection via ResizeObserver when containerHeight is not provided\n * - Supports dynamic item heights via `dynamicItemHeight` input\n *\n * @example\n * ```html\n * <!-- With fixed height items -->\n * <vdnd-virtual-scroll\n * [items]=\"items()\"\n * [itemHeight]=\"50\"\n * [containerHeight]=\"400\"\n * [trackByFn]=\"trackById\">\n * <ng-template let-item let-index=\"index\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-template>\n * </vdnd-virtual-scroll>\n *\n * <!-- With dynamic height items -->\n * <vdnd-virtual-scroll\n * [items]=\"items()\"\n * [itemHeight]=\"50\"\n * [dynamicItemHeight]=\"true\"\n * [containerHeight]=\"400\"\n * [trackByFn]=\"trackById\">\n * <ng-template let-item let-index=\"index\">\n * <div class=\"item\">{{ item.description }}</div>\n * </ng-template>\n * </vdnd-virtual-scroll>\n * ```\n */\n@Component({\n selector: 'vdnd-virtual-scroll',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, DragPlaceholderComponent],\n host: {\n class: 'vdnd-virtual-scroll',\n '[style.height.px]': 'containerHeight() ?? null',\n '[attr.data-item-height]': 'itemHeight()',\n '[attr.data-total-items]': 'items().length',\n },\n template: `\n <!-- Single spacer maintains scroll height -->\n <div class=\"vdnd-virtual-scroll-spacer\" [style.height.px]=\"totalHeight()\"></div>\n\n <!-- Content wrapper positioned via GPU-accelerated transform -->\n <div class=\"vdnd-virtual-scroll-content-wrapper\" [style.transform]=\"contentTransform()\">\n @for (entry of renderedItems(); track trackEntry($index, entry)) {\n @if (entry.type === 'placeholder') {\n <vdnd-drag-placeholder [itemHeight]=\"placeholderHeight()\" />\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate();\n context: {\n $implicit: entry.data,\n index: entry.index,\n isSticky: entry.isSticky,\n }\n \"\n >\n </ng-container>\n }\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n overflow: auto;\n position: relative;\n /* Disable browser scroll anchoring - this prevents scroll position from being\n adjusted when the DOM changes (e.g., when placeholder position updates).\n Without this, autoscroll UP would fight with browser's scroll restoration. */\n overflow-anchor: none;\n }\n\n .vdnd-virtual-scroll-spacer {\n /* Invisible spacer that maintains scroll height */\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n visibility: hidden;\n pointer-events: none;\n }\n\n .vdnd-virtual-scroll-content-wrapper {\n /* GPU-accelerated positioning */\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n will-change: transform;\n }\n `,\n})\nexport class VirtualScrollContainerComponent<T> implements OnInit, AfterViewInit, OnDestroy {\n readonly #dragState = inject(DragStateService);\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #autoScrollService = inject(AutoScrollService);\n readonly #dragIndexCalculator = inject(DragIndexCalculatorService);\n readonly #ngZone = inject(NgZone);\n readonly #injector = inject(Injector);\n\n /** Cleanup function for scroll listener */\n #scrollCleanup: (() => void) | null = null;\n #resizeCleanup: (() => void) | null = null;\n\n /** ResizeObserver for dynamic height measurement */\n #itemResizeObserver: ResizeObserver | null = null;\n\n /** Map from observed HTMLElement to its trackBy key */\n readonly #observedElements = new WeakMap<HTMLElement, unknown>();\n /** Stable mapping from rendered key to observed element for unobserve cleanup */\n readonly #observedElementByKey = new Map<unknown, HTMLElement>();\n\n /** Measured height from ResizeObserver (used when containerHeight is not provided) */\n readonly #measuredHeight = signal(0);\n\n /** Template for rendering each item - passed as input instead of content child for reliability */\n itemTemplate = input.required<TemplateRef<VirtualScrollItemContext<T>>>();\n\n /** Unique ID for this scroll container (used for auto-scroll registration) */\n scrollContainerId = input<string>();\n\n /** Whether auto-scroll is enabled when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n /** Array of items to render */\n items = input.required<T[]>();\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n /**\n * Height of the container in pixels.\n * If not provided, the container will automatically measure its height from CSS.\n * This allows you to set the height via CSS (e.g., flex, height: 100%, etc.)\n * and the component will adapt automatically, including on resize.\n */\n containerHeight = input<number>();\n\n /**\n * Effective height used for calculations.\n * Uses explicit containerHeight if provided, otherwise uses measured height.\n */\n readonly effectiveHeight = computed(() => this.containerHeight() ?? this.#measuredHeight());\n\n /** Number of items to render above/below the visible area */\n overscan = input<number>(3);\n\n /** IDs of items that should always be rendered (e.g., dragged items) */\n stickyItemIds = input<string[]>([]);\n\n /** Function to get a unique ID from an item */\n itemIdFn = input.required<(item: T) => string>();\n\n /**\n * Track-by function for the @for loop.\n * Optional - if not provided, will be derived from itemIdFn.\n */\n trackByFn = input<(index: number, item: T) => string | number>();\n\n /**\n * ID of the droppable this virtual scroll belongs to.\n * Required for placeholder positioning.\n */\n droppableId = input<string>();\n\n /**\n * Whether to automatically add the dragged item to the sticky list.\n * This ensures the dragged item remains visible during virtual scrolling.\n * @default true\n */\n autoStickyDraggedItem = input<boolean>(true);\n\n // ========== Strategy ==========\n\n /** The virtual scroll strategy, created based on dynamicItemHeight input */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n const height = this.itemHeight();\n return this.dynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n /**\n * Effective track-by function - uses provided trackByFn or derives from itemIdFn.\n */\n protected readonly effectiveTrackByFn = computed(() => {\n const userFn = this.trackByFn();\n if (userFn) return userFn;\n\n const idFn = this.itemIdFn();\n return (_index: number, item: T) => idFn(item);\n });\n\n /**\n * Track function for rendered entries (items + placeholder).\n */\n protected trackEntry(\n _index: number,\n entry: { type: 'item' | 'placeholder'; data: T | null; index: number },\n ): string | number {\n if (entry.type === 'placeholder') {\n return '__placeholder__';\n }\n const trackFn = this.effectiveTrackByFn();\n return trackFn(entry.index, entry.data as T);\n }\n\n /**\n * Effective sticky item IDs - combines user-provided IDs with auto-sticky dragged item.\n */\n protected readonly effectiveStickyIds = computed(() => {\n const userIds = this.stickyItemIds();\n\n if (!this.autoStickyDraggedItem()) {\n return userIds;\n }\n\n const draggedId = this.draggedItemId();\n if (!draggedId) {\n return userIds;\n }\n\n // Avoid creating new array if dragged ID is already in the list\n if (userIds.includes(draggedId)) {\n return userIds;\n }\n\n return [...userIds, draggedId];\n });\n\n /** Current scroll position */\n readonly #scrollTop = signal(0);\n\n /** Total height of all items (for scrollbar) */\n protected readonly totalHeight = computed(() => {\n const count = this.items().length;\n const strategy = this.#strategy();\n strategy.version();\n return strategy.getTotalHeight(count);\n });\n\n /** First visible item index */\n readonly #firstVisibleIndex = computed(() => {\n const strategy = this.#strategy();\n strategy.version();\n return strategy.getFirstVisibleIndex(this.#scrollTop());\n });\n\n /** Number of items visible in the viewport */\n readonly #visibleCount = computed(() => {\n const height = this.effectiveHeight();\n const strategy = this.#strategy();\n strategy.version();\n return strategy.getVisibleCount(this.#firstVisibleIndex(), height);\n });\n\n /** Range of items to render (with overscan) */\n readonly #renderRange = computed(() => {\n const first = this.#firstVisibleIndex();\n const visible = this.#visibleCount();\n const overscan = this.overscan();\n const total = this.items().length;\n\n const start = Math.max(0, first - overscan);\n const end = Math.min(total - 1, first + visible + overscan);\n\n return { start, end };\n });\n\n /** Transform offset for content wrapper (position of first rendered item) */\n protected readonly contentTransform = computed(() => {\n const { start } = this.#renderRange();\n const strategy = this.#strategy();\n strategy.version();\n\n const offset = strategy.getOffsetForIndex(start);\n return `translateY(${offset}px)`;\n });\n\n /** The ID of the currently dragged item (if any) */\n protected readonly draggedItemId = computed(() => {\n return this.#dragState.draggedItem()?.draggableId ?? null;\n });\n\n /** Map of item IDs to their indices - rebuilt only when items() changes (O(n) once, then O(1) lookups) */\n readonly #itemIndexMap = computed(() => {\n const items = this.items();\n const idFn = this.itemIdFn();\n const map = new Map<string, number>();\n for (let i = 0; i < items.length; i++) {\n map.set(idFn(items[i]), i);\n }\n return map;\n });\n\n /** The index of the currently dragged item in the items array (-1 if not found or not dragging) */\n readonly #draggedItemIndex = computed(() => {\n const draggedId = this.draggedItemId();\n if (!draggedId) return -1;\n return this.#itemIndexMap().get(draggedId) ?? -1;\n });\n\n /** Memoized Set of sticky IDs - rebuilt only when effectiveStickyIds() changes */\n readonly #stickyIdsSet = computed(() => new Set(this.effectiveStickyIds()));\n\n /** Whether the placeholder should be shown in this container */\n protected readonly shouldShowPlaceholder = computed(() => {\n if (!this.#dragState.isDragging()) return false;\n return this.#dragState.activeDroppableId() === this.droppableId();\n });\n\n /** The placeholder index when placeholder should be shown */\n protected readonly placeholderIndex = computed(() => {\n if (!this.shouldShowPlaceholder()) return -1;\n return this.#dragState.placeholderIndex() ?? -1;\n });\n\n /** Height for the placeholder — use dragged item's actual height in dynamic mode */\n protected readonly placeholderHeight = computed(() => {\n if (this.dynamicItemHeight()) {\n const draggedItemHeight = this.#dragState.draggedItem()?.height;\n if (draggedItemHeight && draggedItemHeight > 0) return draggedItemHeight;\n }\n return this.itemHeight();\n });\n\n /** Items to render, including sticky items and placeholder */\n protected readonly renderedItems = computed(() => {\n const items = this.items();\n const { start, end } = this.#renderRange();\n const stickyIds = this.#stickyIdsSet();\n const idFn = this.itemIdFn();\n const itemIndexMap = this.#itemIndexMap();\n const draggedId = this.draggedItemId();\n const placeholderIdx = this.placeholderIndex();\n\n const result: {\n type: 'item' | 'placeholder';\n data: T | null;\n index: number;\n isSticky: boolean;\n isDragging: boolean;\n }[] = [];\n const renderedIds = new Set<string>();\n let hasPlaceholder = false;\n\n // Add all items in the visible range, inserting placeholder at correct position\n for (let i = start; i <= end && i < items.length; i++) {\n // Insert placeholder before item at placeholderIndex\n if (placeholderIdx === i && !hasPlaceholder) {\n result.push({\n type: 'placeholder',\n data: null,\n index: placeholderIdx,\n isSticky: false,\n isDragging: false,\n });\n hasPlaceholder = true;\n }\n\n const item = items[i];\n const id = idFn(item);\n result.push({\n type: 'item',\n data: item,\n index: i,\n isSticky: stickyIds.has(id),\n isDragging: id === draggedId,\n });\n renderedIds.add(id);\n }\n\n // If placeholder is at the end (after all items), add it\n if (placeholderIdx >= items.length && placeholderIdx >= 0 && !hasPlaceholder) {\n result.push({\n type: 'placeholder',\n data: null,\n index: placeholderIdx,\n isSticky: false,\n isDragging: false,\n });\n hasPlaceholder = true;\n }\n\n // Add any sticky items that aren't already rendered\n const missingStickyIndices: { id: string; index: number }[] = [];\n for (const id of stickyIds) {\n if (renderedIds.has(id)) continue;\n const index = itemIndexMap.get(id);\n if (index === undefined) continue;\n missingStickyIndices.push({ id, index });\n }\n if (missingStickyIndices.length > 1) {\n missingStickyIndices.sort((a, b) => a.index - b.index);\n }\n\n for (const { id, index } of missingStickyIndices) {\n const item = items[index];\n if (item === undefined) continue;\n result.push({\n type: 'item',\n data: item,\n index,\n isSticky: true,\n isDragging: id === draggedId,\n });\n }\n\n return result;\n });\n\n /** Generated ID for auto-scroll registration */\n #generatedScrollId = `vdnd-scroll-${Math.random().toString(36).slice(2, 9)}`;\n\n /** Track previous dragged ID to detect drag end */\n #previousDraggedId: string | null = null;\n\n /** Track previous total height to detect if we were at bottom before drag ended */\n #previousTotalHeight = 0;\n\n constructor() {\n // Keep strategy item keys in sync\n effect(() => {\n const items = this.items();\n const idFn = this.itemIdFn();\n const keys = items.map((item) => idFn(item));\n this.#strategy().setItemKeys(keys);\n });\n\n // Register strategy with drag index calculator for accurate drag calculations\n effect((onCleanup) => {\n const droppableId = this.droppableId();\n const strategy = this.#strategy();\n if (droppableId) {\n this.#dragIndexCalculator.registerStrategy(droppableId, strategy);\n onCleanup(() => this.#dragIndexCalculator.unregisterStrategy(droppableId));\n }\n });\n\n // Set excluded index persistently during same-list drag.\n effect(() => {\n const strategy = this.#strategy();\n const draggedIndex = this.#draggedItemIndex();\n strategy.setExcludedIndex(draggedIndex >= 0 ? draggedIndex : null);\n });\n\n // Keyboard drag autoscroll: scroll to keep target index visible\n effect(() => {\n // Only apply when this droppable is active during keyboard drag\n if (!this.#dragState.isKeyboardDrag()) return;\n const activeDroppable = this.#dragState.activeDroppableId();\n if (activeDroppable !== this.droppableId()) return;\n\n const targetIndex = this.#dragState.keyboardTargetIndex();\n if (targetIndex === null) return;\n\n const strategy = this.#strategy();\n strategy.version();\n const height = this.effectiveHeight();\n if (height <= 0) return;\n\n const element = this.#elementRef.nativeElement;\n const currentScrollTop = element.scrollTop;\n\n // Calculate target item position using strategy\n const targetTop = strategy.getOffsetForIndex(targetIndex);\n const targetBottom = targetTop + strategy.getItemHeight(targetIndex);\n\n // Calculate visible range\n const viewportTop = currentScrollTop;\n const viewportBottom = currentScrollTop + height;\n\n // Check if target is fully visible\n if (targetTop < viewportTop) {\n // Target is above viewport - scroll up\n element.scrollTop = targetTop;\n this.#scrollTop.set(targetTop);\n } else if (targetBottom > viewportBottom) {\n // Target is below viewport - scroll down\n const newScrollTop = targetBottom - height;\n element.scrollTop = newScrollTop;\n this.#scrollTop.set(newScrollTop);\n }\n });\n\n // Preserve scroll position when drag ends at bottom of list.\n // Safety net: totalHeight no longer shrinks during drag (getTotalHeight\n // ignores exclusion), but this logic remains as harmless protection\n // in case future changes reintroduce height variance.\n effect(() => {\n const currentDraggedId = this.draggedItemId();\n const currentTotalHeight = this.totalHeight();\n const element = this.#elementRef.nativeElement;\n\n // Detect drag end (was dragging, now not)\n if (this.#previousDraggedId !== null && currentDraggedId === null) {\n const currentScrollTop = element.scrollTop;\n const strategy = this.#strategy();\n strategy.version();\n const height = this.effectiveHeight();\n const totalItems = this.items().length;\n\n // Calculate if we were at/near bottom (within 10px tolerance)\n // using the height FROM THE PREVIOUS CYCLE (when dragging was active)\n const dragReducedMaxScroll = Math.max(0, this.#previousTotalHeight - height);\n const wasAtBottom = currentScrollTop >= dragReducedMaxScroll - 10;\n\n if (wasAtBottom && dragReducedMaxScroll > 0) {\n // Clear exclusion before calculating new height\n strategy.setExcludedIndex(null);\n\n // Adjust scroll to new bottom position after totalHeight increases\n afterNextRender(\n () => {\n const newTotalHeight = strategy.getTotalHeight(totalItems);\n const newMaxScroll = Math.max(0, newTotalHeight - height);\n element.scrollTop = newMaxScroll;\n this.#scrollTop.set(newMaxScroll);\n },\n { injector: this.#injector },\n );\n }\n }\n\n this.#previousDraggedId = currentDraggedId;\n this.#previousTotalHeight = currentTotalHeight;\n });\n\n // Clamp scrollTop during drag if totalHeight ever shrinks.\n // With the current fix, getTotalHeight no longer excludes the dragged item,\n // so this is effectively a no-op. Kept as a safety net.\n effect(() => {\n const isDragging = this.#dragState.isDragging();\n const totalHeight = this.totalHeight();\n const element = this.#elementRef.nativeElement;\n\n if (isDragging) {\n const containerHeight = this.effectiveHeight();\n const maxScroll = Math.max(0, totalHeight - containerHeight);\n const currentScrollTop = element.scrollTop;\n\n // Clamp scrollTop to valid range\n if (currentScrollTop > maxScroll) {\n element.scrollTop = maxScroll;\n this.#scrollTop.set(maxScroll);\n }\n }\n });\n }\n\n ngOnInit(): void {\n // Register with auto-scroll service\n if (this.autoScrollEnabled()) {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.registerContainer(\n id,\n this.#elementRef.nativeElement,\n this.autoScrollConfig(),\n );\n }\n\n // Set up ResizeObserver for dynamic height measurement\n if (this.dynamicItemHeight()) {\n this.#setupItemResizeObserver();\n }\n }\n\n ngAfterViewInit(): void {\n const element = this.#elementRef.nativeElement;\n\n this.#resizeCleanup = bindResizeObserverHeightSignal({\n element,\n ngZone: this.#ngZone,\n height: this.#measuredHeight,\n minDeltaPx: 1,\n });\n\n // Scroll listener outside Angular zone with RAF throttling.\n // This avoids template event binding which would mark the component dirty 60x/sec.\n this.#scrollCleanup = bindRafThrottledScrollTopSignal({\n element,\n ngZone: this.#ngZone,\n scrollTop: this.#scrollTop,\n thresholdPx: 5,\n });\n\n // Observe rendered items for dynamic height measurement\n if (this.dynamicItemHeight()) {\n this.#observeRenderedItems();\n }\n }\n\n ngOnDestroy(): void {\n this.#scrollCleanup?.();\n this.#resizeCleanup?.();\n for (const element of this.#observedElementByKey.values()) {\n this.#itemResizeObserver?.unobserve(element);\n }\n this.#observedElementByKey.clear();\n this.#itemResizeObserver?.disconnect();\n\n // Unregister from auto-scroll service\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.unregisterContainer(id);\n }\n\n /**\n * Set up ResizeObserver for measuring individual item heights.\n */\n #setupItemResizeObserver(): void {\n this.#ngZone.runOutsideAngular(() => {\n this.#itemResizeObserver = new ResizeObserver((entries) => {\n const strategy = this.#strategy();\n for (const entry of entries) {\n const element = entry.target as HTMLElement;\n const key = this.#observedElements.get(element);\n if (key === undefined) continue;\n\n const height = entry.borderBoxSize?.[0]?.blockSize ?? element.offsetHeight;\n if (height > 0) {\n strategy.setMeasuredHeight(key, height);\n }\n }\n });\n });\n }\n\n /**\n * Observe currently rendered items' DOM elements for height changes.\n * Called after view init and on each render cycle in dynamic mode.\n */\n #observeRenderedItems(): void {\n if (!this.#itemResizeObserver) return;\n\n // Use an effect to re-observe whenever rendered items change\n effect(\n () => {\n const rendered = this.renderedItems();\n const idFn = this.itemIdFn();\n const observer = this.#itemResizeObserver;\n if (!observer) return;\n\n // Find the content wrapper and observe item elements\n const wrapper = this.#elementRef.nativeElement.querySelector(\n '.vdnd-virtual-scroll-content-wrapper',\n );\n if (!wrapper) return;\n\n const nextObservedByKey = new Map<unknown, HTMLElement>();\n\n for (const entry of rendered) {\n if (entry.type !== 'item' || !entry.data) continue;\n const key = idFn(entry.data);\n\n // Find the DOM element for this item by its data-draggable-id\n const el = wrapper.querySelector(`[data-draggable-id=\"${key}\"]`) as HTMLElement | null;\n if (el) {\n nextObservedByKey.set(key, el);\n }\n }\n\n for (const [key, oldElement] of this.#observedElementByKey) {\n const nextElement = nextObservedByKey.get(key);\n if (nextElement !== oldElement) {\n observer.unobserve(oldElement);\n }\n }\n\n for (const [key, nextElement] of nextObservedByKey) {\n const currentElement = this.#observedElementByKey.get(key);\n if (currentElement !== nextElement) {\n this.#observedElements.set(nextElement, key);\n observer.observe(nextElement);\n }\n }\n\n this.#observedElementByKey.clear();\n for (const [key, element] of nextObservedByKey) {\n this.#observedElementByKey.set(key, element);\n }\n },\n { injector: this.#injector },\n );\n }\n\n /**\n * Scroll to a specific position.\n */\n scrollTo(position: number): void {\n this.#elementRef.nativeElement.scrollTop = position;\n this.#scrollTop.set(position);\n }\n\n /**\n * Scroll to a specific item index.\n */\n scrollToIndex(index: number): void {\n const strategy = this.#strategy();\n const position = strategy.getOffsetForIndex(index);\n this.scrollTo(position);\n }\n\n /**\n * Get the current scroll position.\n */\n getScrollTop(): number {\n return this.#scrollTop();\n }\n\n /**\n * Get the total scrollable height.\n */\n getScrollHeight(): number {\n return this.totalHeight();\n }\n\n /**\n * Scroll by a delta amount.\n */\n scrollBy(delta: number): void {\n const newPosition = Math.max(\n 0,\n Math.min(this.getScrollTop() + delta, this.getScrollHeight() - this.effectiveHeight()),\n );\n this.scrollTo(newPosition);\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DragStateService } from '../services/drag-state.service';\nimport { OverlayContainerService } from '../services/overlay-container.service';\n\n/**\n * Context provided to the drag preview template.\n */\nexport interface DragPreviewContext<T = unknown> {\n /** The data associated with the dragged item */\n $implicit: T;\n /** The draggable ID */\n draggableId: string;\n /** The source droppable ID */\n droppableId: string;\n}\n\n/**\n * Renders a preview of the dragged item that follows the cursor.\n *\n * The component automatically teleports itself into a body-level overlay container,\n * so it works correctly even inside ancestors with CSS `transform` (e.g. Ionic pages).\n * It can be placed anywhere in the component tree.\n *\n * @example\n * ```html\n * <vdnd-drag-preview>\n * <ng-template let-data let-id=\"draggableId\">\n * <div class=\"drag-preview\">{{ data.name }}</div>\n * </ng-template>\n * </vdnd-drag-preview>\n * ```\n */\n@Component({\n selector: 'vdnd-drag-preview',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n @if (isVisible()) {\n <div\n class=\"vdnd-drag-preview\"\n data-testid=\"vdnd-drag-preview\"\n [style.transform]=\"transform()\"\n [style.width.px]=\"dimensions().width\"\n [style.height.px]=\"dimensions().height\"\n >\n @if (previewTemplate()) {\n <ng-container *ngTemplateOutlet=\"previewTemplate()!; context: templateContext()\">\n </ng-container>\n } @else if (clonedElement()) {\n <div class=\"vdnd-drag-preview-clone\" #cloneContainer></div>\n } @else {\n <div class=\"vdnd-drag-preview-default\">\n {{ dragState.draggedItem()?.draggableId }}\n </div>\n }\n </div>\n }\n `,\n styles: `\n .vdnd-drag-preview {\n box-sizing: border-box;\n position: fixed;\n left: 0;\n top: 0;\n will-change: transform;\n pointer-events: none;\n z-index: 1000;\n }\n\n .vdnd-drag-preview-clone {\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n `,\n})\nexport class DragPreviewComponent<T = unknown> implements OnDestroy {\n protected readonly dragState = inject(DragStateService);\n readonly #overlayContainer = inject(OverlayContainerService);\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n\n /** Optional custom template for the preview */\n previewTemplate = input<TemplateRef<DragPreviewContext<T>>>();\n\n /** Offset from cursor to preview (to avoid cursor being on top of preview) */\n cursorOffset = input<{ x: number; y: number }>({ x: 8, y: 8 });\n\n /** Reference to the clone container element (cannot use ES private with viewChild) */\n private readonly cloneContainer = viewChild<ElementRef<HTMLElement>>('cloneContainer');\n\n /** The cloned element from drag state (used when no custom template is provided) */\n protected readonly clonedElement = computed(() => {\n if (this.previewTemplate()) {\n return null; // Custom template takes precedence\n }\n return this.dragState.draggedItem()?.clonedElement ?? null;\n });\n\n constructor() {\n // Teleport host element into the body-level overlay container after first render.\n // This escapes any ancestor CSS transforms that would break position: fixed.\n afterNextRender(() => {\n const container = this.#overlayContainer.getContainerElement();\n if (container) {\n container.appendChild(this.#elementRef.nativeElement);\n }\n });\n\n // Effect to insert the cloned element into the container\n effect(() => {\n const container = this.cloneContainer()?.nativeElement;\n const clone = this.clonedElement();\n\n if (!container) {\n return;\n }\n\n // Clear previous content and append the prepared clone element.\n // Avoid cloning again: ElementCloneService already creates a styled/sanitized clone.\n container.innerHTML = '';\n if (clone) {\n container.appendChild(clone);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.#elementRef.nativeElement.remove();\n }\n\n /** Whether the preview is visible */\n protected readonly isVisible = computed(() => {\n return this.dragState.isDragging() && this.dragState.cursorPosition() !== null;\n });\n\n /** Position of the preview */\n protected readonly position = computed(() => {\n const cursor = this.dragState.cursorPosition();\n const grabOffset = this.dragState.grabOffset();\n const fallbackOffset = this.cursorOffset();\n const initialPosition = this.dragState.initialPosition();\n const lockAxis = this.dragState.lockAxis();\n\n if (!cursor) {\n return { x: 0, y: 0 };\n }\n\n // Use grab offset if available (preserves grab position), otherwise fall back to cursorOffset input\n const offset = grabOffset ?? fallbackOffset;\n\n let x = cursor.x - offset.x;\n let y = cursor.y - offset.y;\n\n // Apply axis locking if configured\n if (lockAxis && initialPosition) {\n if (lockAxis === 'x') {\n // Lock X axis: x stays at initial position\n x = initialPosition.x - offset.x;\n } else if (lockAxis === 'y') {\n // Lock Y axis: y stays at initial position\n y = initialPosition.y - offset.y;\n }\n }\n\n return { x, y };\n });\n\n /** Transform-based positioning for better performance (avoid layout from left/top). */\n protected readonly transform = computed(() => {\n const { x, y } = this.position();\n return `translate3d(${x}px, ${y}px, 0)`;\n });\n\n /** Dimensions of the preview */\n protected readonly dimensions = computed(() => {\n const item = this.dragState.draggedItem();\n\n if (!item) {\n return { width: 100, height: 50 };\n }\n\n return {\n width: item.width,\n height: item.height,\n };\n });\n\n /** Template context */\n protected readonly templateContext = computed((): DragPreviewContext<T> => {\n const item = this.dragState.draggedItem();\n\n return {\n $implicit: (item?.data ?? null) as T,\n draggableId: item?.draggableId ?? '',\n droppableId: item?.droppableId ?? '',\n };\n });\n}\n","import { ChangeDetectionStrategy, Component, input, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * Context provided to the custom placeholder template.\n */\nexport interface PlaceholderContext {\n /** The height of the placeholder in pixels */\n $implicit: number;\n /** The height of the placeholder in pixels (explicit property) */\n height: number;\n}\n\n/**\n * A placeholder component that indicates where a dropped item will be inserted.\n *\n * By default, renders as empty/transparent space. Pass a custom template\n * to customize the placeholder appearance.\n *\n * @example\n * ```html\n * <!-- Default: transparent/empty space -->\n * <vdnd-placeholder [height]=\"50\"></vdnd-placeholder>\n *\n * <!-- Custom template with dashed border -->\n * <vdnd-placeholder [height]=\"50\" [template]=\"customPlaceholder\">\n * <ng-template #customPlaceholder let-height>\n * <div class=\"my-placeholder\" [style.height.px]=\"height\">\n * Drop here\n * </div>\n * </ng-template>\n * </vdnd-placeholder>\n * ```\n */\n@Component({\n selector: 'vdnd-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n class: 'vdnd-placeholder',\n '[style.height.px]': 'height()',\n '[attr.data-draggable-id]': '\"placeholder\"',\n },\n template: `\n @if (template()) {\n <ng-container\n *ngTemplateOutlet=\"template()!; context: { $implicit: height(), height: height() }\"\n >\n </ng-container>\n }\n `,\n styles: `\n :host {\n display: block;\n box-sizing: border-box;\n }\n `,\n})\nexport class PlaceholderComponent {\n /** Height of the placeholder in pixels */\n height = input<number>(50);\n\n /** Optional custom template for the placeholder content */\n template = input<TemplateRef<PlaceholderContext>>();\n}\n","import { Directive, InjectionToken, input, Signal } from '@angular/core';\n\n/**\n * Token for injecting the group context from a parent directive.\n * Allows child draggables and droppables to inherit the group name automatically.\n */\nexport const VDND_GROUP_TOKEN = new InjectionToken<VdndGroupContext>('VDND_GROUP_TOKEN');\n\n/**\n * Context provided by the group directive to its children.\n */\nexport interface VdndGroupContext {\n /** The group name signal */\n readonly group: Signal<string>;\n}\n\n/**\n * Provides a group context to child draggable and droppable directives.\n * When applied to a parent element, child directives can inherit the group name\n * automatically without needing to specify it on each element.\n *\n * @example\n * ```html\n * <!-- Without group directive (verbose) -->\n * <div vdndDroppable=\"list-1\" vdndDroppableGroup=\"my-group\">\n * <div vdndDraggable=\"item-1\" vdndDraggableGroup=\"my-group\">Item 1</div>\n * <div vdndDraggable=\"item-2\" vdndDraggableGroup=\"my-group\">Item 2</div>\n * </div>\n *\n * <!-- With group directive (concise) -->\n * <div vdndGroup=\"my-group\">\n * <div vdndDroppable=\"list-1\">\n * <div vdndDraggable=\"item-1\">Item 1</div>\n * <div vdndDraggable=\"item-2\">Item 2</div>\n * </div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndGroup]',\n providers: [\n {\n provide: VDND_GROUP_TOKEN,\n useExisting: DroppableGroupDirective,\n },\n ],\n})\nexport class DroppableGroupDirective implements VdndGroupContext {\n /** The group name that will be inherited by child directives */\n readonly group = input.required<string>({ alias: 'vdndGroup' });\n}\n","import { computed, isDevMode, type Signal } from '@angular/core';\nimport type { VdndGroupContext } from '../directives/droppable-group.directive';\n\n/**\n * Configuration options for creating an effective group signal.\n */\nexport interface GroupResolutionOptions {\n /** The explicit group input signal */\n explicitGroup: Signal<string | undefined>;\n /** The parent group context injected via VDND_GROUP_TOKEN (may be null) */\n parentGroup: VdndGroupContext | null;\n /** The element ID signal for warning messages */\n elementId: Signal<string>;\n /** The type of element ('draggable' or 'droppable') for warning messages */\n elementType: 'draggable' | 'droppable';\n}\n\n/**\n * State tracker for group resolution to avoid repeated warnings.\n */\ninterface GroupResolutionState {\n hasWarnedMissingGroup: boolean;\n}\n\n/**\n * Creates a computed signal that resolves the effective group name for a draggable or droppable.\n *\n * Resolution order:\n * 1. Explicit group input (vdndDraggableGroup or vdndDroppableGroup)\n * 2. Inherited group from parent vdndGroup directive\n * 3. null (with dev-mode warning)\n *\n * @example\n * ```typescript\n * readonly #effectiveGroup = createEffectiveGroupSignal({\n * explicitGroup: this.vdndDraggableGroup,\n * parentGroup: this.#parentGroup,\n * elementId: this.vdndDraggable,\n * elementType: 'draggable',\n * });\n * ```\n */\nexport function createEffectiveGroupSignal(options: GroupResolutionOptions): Signal<string | null> {\n const { explicitGroup, parentGroup, elementId, elementType } = options;\n\n // State object to track whether we've warned (mutable closure state)\n const state: GroupResolutionState = { hasWarnedMissingGroup: false };\n\n return computed((): string | null => {\n const explicit = explicitGroup();\n if (explicit) return explicit;\n\n const inherited = parentGroup?.group();\n if (inherited) return inherited;\n\n if (isDevMode() && !state.hasWarnedMissingGroup) {\n const directive = elementType === 'draggable' ? 'vdndDraggable' : 'vdndDroppable';\n const groupInput = elementType === 'draggable' ? 'vdndDraggableGroup' : 'vdndDroppableGroup';\n const action = elementType === 'draggable' ? 'Drag' : 'Dropping';\n\n console.warn(\n `[ngx-virtual-dnd] [${directive}=\"${elementId()}\"] requires a group. ` +\n `Either set ${groupInput} or wrap in a vdndGroup directive. ` +\n `${action} will be disabled for this element.`,\n );\n state.hasWarnedMissingGroup = true;\n }\n\n return null;\n });\n}\n","import {\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n} from '@angular/core';\nimport { DragStateService } from '../services/drag-state.service';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport { DragState, DropEvent, END_OF_LIST } from '../models/drag-drop.models';\nimport { VDND_GROUP_TOKEN } from './droppable-group.directive';\nimport { createEffectiveGroupSignal } from '../utils/group-resolution';\n\n/**\n * Marks an element as a valid drop target within the virtual scroll drag-and-drop system.\n *\n * @example\n * ```html\n * <!-- With explicit group -->\n * <div\n * vdndDroppable=\"list-1\"\n * vdndDroppableGroup=\"my-group\"\n * (drop)=\"onDrop($event)\">\n * <!-- Draggable items here -->\n * </div>\n *\n * <!-- With inherited group from parent vdndGroup directive -->\n * <div vdndGroup=\"my-group\">\n * <div vdndDroppable=\"list-1\" (drop)=\"onDrop($event)\">\n * <!-- Draggable items here -->\n * </div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndDroppable]',\n host: {\n '[attr.data-droppable-id]': 'vdndDroppable()',\n '[attr.data-droppable-group]': 'effectiveGroup()',\n '[attr.data-constrain-to-container]': 'constrainToContainer() || null',\n '[attr.aria-dropeffect]': '\"move\"',\n '[class.vdnd-droppable]': 'true',\n '[class.vdnd-droppable-active]': 'isActive()',\n '[class.vdnd-droppable-disabled]': 'disabled()',\n },\n})\nexport class DroppableDirective implements OnInit, OnDestroy {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #dragState = inject(DragStateService);\n readonly #autoScroll = inject(AutoScrollService);\n readonly #parentGroup = inject(VDND_GROUP_TOKEN, { optional: true });\n\n /** Unique identifier for this droppable */\n vdndDroppable = input.required<string>();\n\n /**\n * Drag-and-drop group name.\n * Optional when a parent `vdndGroup` directive provides the group context.\n */\n vdndDroppableGroup = input<string>();\n\n /**\n * Resolved group name - uses explicit input or falls back to parent group.\n * Returns null (and disables dropping) if neither is available.\n */\n readonly effectiveGroup = createEffectiveGroupSignal({\n explicitGroup: this.vdndDroppableGroup,\n parentGroup: this.#parentGroup,\n elementId: this.vdndDroppable,\n elementType: 'droppable',\n });\n\n /** Optional data associated with this droppable */\n vdndDroppableData = input<unknown>();\n\n /** Whether this droppable is disabled */\n disabled = input<boolean>(false);\n\n /** Enable auto-scroll when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n /** Constrain drag preview and placeholder to container boundaries */\n constrainToContainer = input<boolean>(false);\n\n /** Emits when an item is dropped on this droppable */\n // eslint-disable-next-line @angular-eslint/no-output-native\n drop = output<DropEvent>();\n\n /** Whether this droppable is currently being targeted */\n readonly isActive = computed(() => {\n const activeId = this.#dragState.activeDroppableId();\n return activeId === this.vdndDroppable() && !this.disabled();\n });\n\n /** The current placeholder ID when this droppable is active */\n readonly placeholderId = computed(() => {\n if (!this.isActive()) {\n return null;\n }\n return this.#dragState.placeholderId();\n });\n\n /** Track previous active state for cache clearing on leave */\n #wasActive = false;\n\n /** Cached state for handling drop (since state is cleared before effect fires) */\n #cachedDragState: DragState | null = null;\n\n ngOnInit(): void {\n // Without a group, this droppable can't participate in DnD (fail gracefully).\n if (!this.effectiveGroup()) {\n return;\n }\n\n // Register with auto-scroll service only if this element is actually scrollable\n // (i.e., has overflow: auto/scroll and content taller than container)\n if (this.autoScrollEnabled() && this.#isScrollable()) {\n this.#autoScroll.registerContainer(\n this.vdndDroppable(),\n this.#elementRef.nativeElement,\n this.autoScrollConfig(),\n );\n }\n }\n\n /**\n * Check if this element is actually scrollable.\n */\n #isScrollable(): boolean {\n const el = this.#elementRef.nativeElement;\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n const overflowX = style.overflowX;\n\n // Check if overflow allows scrolling\n const hasScrollableOverflow =\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowX === 'auto' ||\n overflowX === 'scroll';\n\n if (!hasScrollableOverflow) {\n return false;\n }\n\n // Check if content is larger than container\n return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;\n }\n\n constructor() {\n // React to state changes and handle drop events\n effect(() => {\n const active = this.isActive();\n const draggedItem = this.#dragState.draggedItem();\n const isDragging = this.#dragState.isDragging();\n\n // Cache state while active for use during drop handling\n if (active && isDragging && draggedItem) {\n this.#cachedDragState = this.#dragState.getStateSnapshot();\n }\n\n // Handle drag end (drop)\n if (!isDragging && this.#wasActive && draggedItem === null) {\n // Check if drag was cancelled (e.g., Escape key)\n if (!this.#dragState.wasCancelled()) {\n // Drag ended normally - this is a drop\n this.#handleDrop();\n }\n this.#cachedDragState = null;\n }\n\n // Clear cached state when leaving without dropping\n if (!active && this.#wasActive && isDragging) {\n this.#cachedDragState = null;\n }\n\n this.#wasActive = active;\n });\n }\n\n ngOnDestroy(): void {\n // Clean up if this droppable is destroyed while being active\n if (this.isActive()) {\n this.#dragState.setActiveDroppable(null);\n }\n\n // Unregister from auto-scroll\n this.#autoScroll.unregisterContainer(this.vdndDroppable());\n }\n\n /**\n * Handle a drop on this droppable.\n */\n #handleDrop(): void {\n // Use cached state since the actual state is cleared before this effect fires\n const state = this.#cachedDragState;\n\n if (!state?.draggedItem || state.activeDroppableId !== this.vdndDroppable()) {\n return;\n }\n\n const sourceDroppableId = state.sourceDroppableId ?? '';\n const placeholderId = state.placeholderId ?? END_OF_LIST;\n\n // Use the stored source index from drag state\n // This is critical for virtual scrolling where the original element may no longer\n // be in the DOM after autoscroll (it gets virtualized out of view)\n const sourceIndex =\n state.sourceIndex ?? this.#getItemIndex(state.draggedItem.draggableId, sourceDroppableId);\n\n // Use the pre-calculated placeholderIndex if available (more reliable)\n // Fall back to DOM-based calculation if not\n let destinationIndex =\n state.placeholderIndex !== null && state.placeholderIndex !== undefined\n ? state.placeholderIndex\n : this.#getDestinationIndex(placeholderId);\n\n // Adjust for same-list reordering: if moving within the same list and\n // the destination is after the source, we need to account for the item\n // being removed from its original position\n if (sourceDroppableId === this.vdndDroppable() && sourceIndex < destinationIndex) {\n destinationIndex--;\n }\n\n this.drop.emit({\n source: {\n draggableId: state.draggedItem.draggableId,\n droppableId: sourceDroppableId,\n index: sourceIndex,\n data: state.draggedItem.data,\n },\n destination: {\n droppableId: this.vdndDroppable(),\n placeholderId,\n index: destinationIndex,\n data: this.vdndDroppableData(),\n },\n });\n }\n\n /**\n * Get the index of an item in a droppable.\n * This is a simplified implementation - in practice, the consumer would track this.\n */\n #getItemIndex(draggableId: string, droppableId: string): number {\n // Find all draggables in the source droppable\n const droppable = document.querySelector(`[data-droppable-id=\"${droppableId}\"]`);\n if (!droppable) {\n return 0;\n }\n\n const draggables = droppable.querySelectorAll('[data-draggable-id]');\n for (let i = 0; i < draggables.length; i++) {\n if (draggables[i].getAttribute('data-draggable-id') === draggableId) {\n return i;\n }\n }\n\n return 0;\n }\n\n /**\n * Get the destination index based on the placeholder.\n */\n #getDestinationIndex(placeholderId: string): number {\n // Exclude placeholder elements from the count\n const draggables = this.#elementRef.nativeElement.querySelectorAll(\n '[data-draggable-id]:not([data-draggable-id=\"placeholder\"])',\n );\n\n if (placeholderId === END_OF_LIST) {\n return draggables.length;\n }\n\n // Find the index of the placeholder item\n for (let i = 0; i < draggables.length; i++) {\n if (draggables[i].getAttribute('data-draggable-id') === placeholderId) {\n return i;\n }\n }\n\n return 0;\n }\n\n /**\n * Get the element reference (for external use).\n */\n getElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Manually scroll this droppable.\n */\n scrollBy(delta: number): void {\n this.#elementRef.nativeElement.scrollTop += delta;\n }\n\n /**\n * Get the current scroll position.\n */\n getScrollTop(): number {\n return this.#elementRef.nativeElement.scrollTop;\n }\n\n /**\n * Get the scroll height.\n */\n getScrollHeight(): number {\n return this.#elementRef.nativeElement.scrollHeight;\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output, TemplateRef } from '@angular/core';\nimport {\n VirtualScrollContainerComponent,\n VirtualScrollItemContext,\n} from './virtual-scroll-container.component';\nimport { DroppableDirective } from '../directives/droppable.directive';\nimport { AutoScrollConfig } from '../services/auto-scroll.service';\nimport { DropEvent } from '../models/drag-drop.models';\n\n/**\n * A high-level component that combines droppable, virtual scroll, and placeholder\n * functionality into a single, easy-to-use component.\n *\n * This component significantly reduces boilerplate by automatically handling:\n * - Placeholder insertion at the correct position\n * - Sticky item management for the dragged item\n * - Virtual scrolling with proper drag-and-drop integration\n * - Droppable container setup\n *\n * @example\n * ```html\n * <!-- Before (verbose): ~45 lines of boilerplate -->\n * <div vdndDroppable=\"list-1\" vdndDroppableGroup=\"demo\" (drop)=\"onDrop($event)\">\n * <vdnd-virtual-scroll\n * [items]=\"itemsWithPlaceholder()\"\n * [itemHeight]=\"50\"\n * [stickyItemIds]=\"stickyIds()\"\n * [itemIdFn]=\"getItemId\"\n * [trackByFn]=\"trackById\"\n * [itemTemplate]=\"itemTpl\">\n * </vdnd-virtual-scroll>\n * </div>\n *\n * <!-- After (concise): ~8 lines -->\n * <div vdndGroup=\"demo\">\n * <vdnd-sortable-list\n * droppableId=\"list-1\"\n * [items]=\"list()\"\n * [itemHeight]=\"50\"\n * [itemIdFn]=\"getItemId\"\n * [itemTemplate]=\"itemTpl\"\n * (drop)=\"onDrop($event)\">\n * </vdnd-sortable-list>\n * </div>\n * ```\n */\n@Component({\n selector: 'vdnd-sortable-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [VirtualScrollContainerComponent, DroppableDirective],\n host: {\n class: 'vdnd-sortable-list',\n },\n template: `\n <div\n class=\"vdnd-sortable-list-droppable\"\n [vdndDroppable]=\"droppableId()\"\n [vdndDroppableGroup]=\"group()\"\n [vdndDroppableData]=\"droppableData()\"\n [disabled]=\"disabled()\"\n [constrainToContainer]=\"constrainToContainer()\"\n (drop)=\"drop.emit($event)\"\n >\n <vdnd-virtual-scroll\n [items]=\"items()\"\n [itemHeight]=\"itemHeight()\"\n [dynamicItemHeight]=\"dynamicItemHeight()\"\n [itemIdFn]=\"itemIdFn()\"\n [trackByFn]=\"trackByFn()\"\n [itemTemplate]=\"itemTemplate()\"\n [droppableId]=\"droppableId()\"\n [autoStickyDraggedItem]=\"true\"\n [containerHeight]=\"containerHeight()\"\n [overscan]=\"overscan()\"\n [autoScrollEnabled]=\"autoScrollEnabled()\"\n [autoScrollConfig]=\"autoScrollConfig()\"\n >\n </vdnd-virtual-scroll>\n </div>\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n})\nexport class VirtualSortableListComponent<T> {\n // ========== Required Inputs ==========\n\n /** Unique identifier for this droppable list */\n droppableId = input.required<string>();\n\n /**\n * Drag-and-drop group name.\n * Optional when a parent `vdndGroup` directive provides the group context.\n */\n group = input<string>();\n\n /** Array of items to render */\n items = input.required<T[]>();\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n /** Function to get a unique ID from an item */\n itemIdFn = input.required<(item: T) => string>();\n\n /** Template for rendering each item */\n itemTemplate = input.required<TemplateRef<VirtualScrollItemContext<T>>>();\n\n // ========== Optional Inputs ==========\n\n /**\n * Track-by function for the @for loop.\n * Optional - if not provided, will be derived from itemIdFn.\n */\n trackByFn = input<(index: number, item: T) => string | number>();\n\n /** Optional data associated with this droppable */\n droppableData = input<unknown>();\n\n /** Whether this sortable list is disabled */\n disabled = input<boolean>(false);\n\n /**\n * Height of the container in pixels.\n * If not provided, uses CSS-based height detection.\n */\n containerHeight = input<number>();\n\n /** Number of items to render above/below the visible area */\n overscan = input<number>(3);\n\n /** Enable auto-scroll when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n /** Constrain drag preview and placeholder to container boundaries */\n constrainToContainer = input<boolean>(false);\n\n // ========== Outputs ==========\n\n /** Emits when an item is dropped on this list */\n // eslint-disable-next-line @angular-eslint/no-output-native\n drop = output<DropEvent>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n} from '@angular/core';\nimport { VDND_VIRTUAL_VIEWPORT, VdndVirtualViewport } from '../tokens/virtual-viewport.token';\nimport { VDND_SCROLL_CONTAINER, VdndScrollContainer } from '../tokens/scroll-container.token';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport {\n bindRafThrottledScrollTopSignal,\n bindResizeObserverHeightSignal,\n} from '../utils/dom-signal-bindings';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\n\n/**\n * A virtual viewport component that provides efficient wrapper-based positioning\n * for virtual scrolling. This component acts as the scroll container and provides\n * a content wrapper with GPU-accelerated transform positioning.\n *\n * Use this component when you need virtual scrolling with optimal performance.\n * Items rendered inside via `*vdndVirtualFor` will be positioned using a single\n * transform on the wrapper, rather than individual absolute positioning.\n *\n * @example\n * Basic usage:\n * ```html\n * <vdnd-virtual-viewport [itemHeight]=\"50\" style=\"height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-viewport>\n * ```\n *\n * @example\n * With dynamic item heights:\n * ```html\n * <vdnd-virtual-viewport\n * [itemHeight]=\"50\"\n * [dynamicItemHeight]=\"true\"\n * style=\"height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-viewport>\n * ```\n */\n@Component({\n selector: 'vdnd-virtual-viewport',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: VDND_VIRTUAL_VIEWPORT, useExisting: VirtualViewportComponent },\n { provide: VDND_SCROLL_CONTAINER, useExisting: VirtualViewportComponent },\n ],\n host: {\n class: 'vdnd-virtual-viewport',\n },\n styles: `\n :host {\n display: block;\n overflow: auto;\n position: relative;\n /* Disable browser scroll anchoring to prevent scroll position adjustments\n when DOM changes (e.g., placeholder position updates during drag) */\n overflow-anchor: none;\n }\n\n .vdnd-viewport-spacer {\n position: absolute;\n left: 0;\n width: 1px;\n visibility: hidden;\n pointer-events: none;\n }\n\n .vdnd-viewport-content {\n position: absolute;\n left: 0;\n right: 0;\n will-change: transform;\n }\n `,\n template: `\n <!-- Spacer maintains total scroll height -->\n <div\n class=\"vdnd-viewport-spacer\"\n [style.top.px]=\"contentOffset()\"\n [style.height.px]=\"totalHeight()\"\n ></div>\n\n <!-- Content wrapper with GPU-accelerated transform -->\n <div\n class=\"vdnd-viewport-content\"\n [style.top.px]=\"contentOffset()\"\n [style.transform]=\"contentTransform()\"\n >\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class VirtualViewportComponent\n implements VdndVirtualViewport, VdndScrollContainer, OnInit, OnDestroy\n{\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #ngZone = inject(NgZone);\n readonly #autoScrollService = inject(AutoScrollService);\n\n /** Current scroll position (reactive) */\n readonly #scrollTop = signal(0);\n\n /** Measured container height (reactive) */\n readonly #containerHeight = signal(0);\n\n /** Cleanup function for scroll listener */\n #scrollCleanup: (() => void) | null = null;\n #resizeCleanup: (() => void) | null = null;\n\n /** Generated ID for auto-scroll registration */\n #generatedScrollId = `vdnd-viewport-${Math.random().toString(36).slice(2, 9)}`;\n\n /**\n * The actual first rendered item index, set by VirtualForDirective.\n * This accounts for overscan and is used for wrapper positioning.\n */\n readonly #renderStartIndex = signal(0);\n\n // ========== Inputs ==========\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n /** Offset for content below headers (in pixels) */\n contentOffset = input<number>(0);\n\n /** Unique ID for this scroll container (used for auto-scroll registration) */\n scrollContainerId = input<string>();\n\n /** Whether auto-scroll is enabled when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n // ========== Strategy ==========\n\n /** The virtual scroll strategy, created based on dynamicItemHeight input */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n const height = this.itemHeight();\n return this.dynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n get strategy(): VirtualScrollStrategy {\n return this.#strategy();\n }\n\n // ========== Computed Values ==========\n\n /** Total height of all items (for scroll height), derived from strategy item count */\n readonly totalHeight = computed(() => {\n const s = this.#strategy();\n s.version();\n return s.getTotalHeight(s.getItemCount());\n });\n\n /** Transform for content wrapper positioning */\n readonly contentTransform = computed(() => {\n const startIndex = this.#renderStartIndex();\n const s = this.#strategy();\n const offset = s.getOffsetForIndex(startIndex);\n return `translateY(${offset}px)`;\n });\n\n // ========== VdndVirtualViewport Implementation ==========\n\n scrollTop(): number {\n return this.#scrollTop();\n }\n\n containerHeight(): number {\n return this.#containerHeight();\n }\n\n get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Called by VirtualForDirective to inform this viewport of the actual\n * first rendered item index. Used for wrapper positioning.\n */\n setRenderStartIndex(index: number): void {\n this.#renderStartIndex.set(index);\n }\n\n getOffsetForIndex(index: number): number {\n return this.#strategy().getOffsetForIndex(index);\n }\n\n // ========== VdndScrollContainer Implementation ==========\n\n scrollTo(options: ScrollToOptions): void {\n this.nativeElement.scrollTo(options);\n }\n\n scrollBy(delta: number): void {\n const newPosition = Math.max(\n 0,\n Math.min(\n this.scrollTop() + delta,\n this.nativeElement.scrollHeight - this.nativeElement.clientHeight,\n ),\n );\n this.scrollTo({ top: newPosition });\n }\n\n // ========== Lifecycle ==========\n\n ngOnInit(): void {\n this.#setupScrollListener();\n this.#setupResizeObserver();\n this.#registerAutoScroll();\n }\n\n ngOnDestroy(): void {\n this.#scrollCleanup?.();\n this.#resizeCleanup?.();\n this.#unregisterAutoScroll();\n }\n\n // ========== Private Methods ==========\n\n /** Minimum scroll delta (px) to trigger signal update */\n readonly #scrollThreshold = 5;\n\n #setupScrollListener(): void {\n this.#scrollCleanup = bindRafThrottledScrollTopSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n scrollTop: this.#scrollTop,\n thresholdPx: this.#scrollThreshold,\n });\n }\n\n #setupResizeObserver(): void {\n this.#resizeCleanup = bindResizeObserverHeightSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n height: this.#containerHeight,\n minDeltaPx: 1,\n });\n }\n\n #registerAutoScroll(): void {\n if (this.autoScrollEnabled()) {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.registerContainer(id, this.nativeElement, this.autoScrollConfig());\n }\n }\n\n #unregisterAutoScroll(): void {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.unregisterContainer(id);\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n/**\n * Marks an element as the header content for a `vdnd-virtual-content` component.\n *\n * Place this directive on a projected element inside `<vdnd-virtual-content>`.\n * The component will automatically measure the header's height via ResizeObserver\n * and use it as the content offset for virtual scroll calculations.\n *\n * This eliminates the need for manual ResizeObserver boilerplate that was\n * previously required with the `[contentOffset]` input.\n *\n * @example\n * ```html\n * <vdnd-virtual-content [itemHeight]=\"50\">\n * <div class=\"page-header\" vdndContentHeader>\n * <h1>My List</h1>\n * </div>\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-content>\n * ```\n */\n@Directive({\n selector: '[vdndContentHeader]',\n})\nexport class ContentHeaderDirective {\n readonly elementRef = inject(ElementRef<HTMLElement>);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n signal,\n} from '@angular/core';\nimport { VDND_VIRTUAL_VIEWPORT, VdndVirtualViewport } from '../tokens/virtual-viewport.token';\nimport { VDND_SCROLL_CONTAINER, VdndScrollContainer } from '../tokens/scroll-container.token';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\nimport { ContentHeaderDirective } from '../directives/content-header.directive';\n\n/**\n * A virtual content component that provides wrapper-based positioning\n * for virtual scrolling within an EXTERNAL scroll container.\n *\n * Use this component when you need virtual scrolling alongside other content\n * (headers, footers) within a shared scroll container. The component provides\n * a content wrapper with GPU-accelerated transform positioning while delegating\n * scroll handling to the parent `vdndScrollable` container.\n *\n * Headers marked with `vdndContentHeader` are automatically measured via\n * ResizeObserver — no manual offset calculation needed.\n *\n * @example\n * Content projection with auto-measured header:\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 100vh;\">\n * <vdnd-virtual-content [itemHeight]=\"50\">\n * <div class=\"header\" vdndContentHeader>Welcome!</div>\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-content>\n * </div>\n * ```\n *\n * @example\n * Manual offset (escape hatch):\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 100vh;\">\n * <div class=\"header\" #header>Welcome!</div>\n * <vdnd-virtual-content [itemHeight]=\"50\" [contentOffset]=\"header.offsetHeight\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-content>\n * </div>\n * ```\n */\n@Component({\n selector: 'vdnd-virtual-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: VDND_VIRTUAL_VIEWPORT, useExisting: VirtualContentComponent },\n { provide: VDND_SCROLL_CONTAINER, useExisting: VirtualContentComponent },\n ],\n host: {\n class: 'vdnd-virtual-content',\n '[attr.data-content-offset]': 'effectiveContentOffset()',\n '[attr.data-item-height]': 'itemHeight()',\n '[attr.data-total-items]': 'totalItems()',\n },\n styles: `\n :host {\n display: block;\n position: relative;\n }\n\n .vdnd-virtual-area {\n position: relative;\n }\n\n .vdnd-content-spacer {\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n visibility: hidden;\n pointer-events: none;\n }\n\n .vdnd-content-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n will-change: transform;\n }\n `,\n template: `\n <!-- Projected header — in normal document flow, auto-measured via ResizeObserver -->\n <ng-content select=\"[vdndContentHeader]\" />\n\n <!-- Virtual area — sized to totalHeight, contains absolute-positioned spacer + wrapper -->\n <div class=\"vdnd-virtual-area\" [style.height.px]=\"totalHeight()\">\n <!-- Spacer maintains scroll height for the virtual list portion -->\n <div class=\"vdnd-content-spacer\" [style.height.px]=\"totalHeight()\"></div>\n\n <!-- Content wrapper with GPU-accelerated transform -->\n <div class=\"vdnd-content-wrapper\" [style.transform]=\"contentTransform()\">\n <ng-content />\n </div>\n </div>\n `,\n})\nexport class VirtualContentComponent implements VdndVirtualViewport, VdndScrollContainer {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #ngZone = inject(NgZone);\n\n /**\n * The parent scroll container injected via skip-self to get the actual scrollable element.\n * We provide our own VDND_SCROLL_CONTAINER with adjusted values to children.\n */\n readonly #parentScrollContainer = inject(VDND_SCROLL_CONTAINER, { skipSelf: true });\n\n // ========== Content Queries ==========\n\n /** Projected header directive (if any) */\n private readonly headerDirective = contentChild(ContentHeaderDirective);\n\n // ========== Inputs ==========\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Offset for content above the virtual list (e.g., header height).\n * When a `vdndContentHeader` is projected, this input is ignored —\n * the offset is auto-measured via ResizeObserver.\n * Use this input only when the header lives outside the component.\n */\n contentOffset = input<number>(0);\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n // ========== Internal State ==========\n\n /**\n * The actual first rendered item index, set by VirtualForDirective.\n * This accounts for overscan and is used for wrapper positioning.\n */\n readonly #renderStartIndex = signal(0);\n\n /** Auto-measured header height from ResizeObserver */\n readonly #measuredHeaderHeight = signal(0);\n\n // ========== Strategy ==========\n\n /** The virtual scroll strategy, created based on dynamicItemHeight input */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n const height = this.itemHeight();\n return this.dynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n get strategy(): VirtualScrollStrategy {\n return this.#strategy();\n }\n\n // ========== Computed Values ==========\n\n /** Total item count, derived from strategy (populated by VirtualForDirective) */\n readonly totalItems = computed(() => {\n const s = this.#strategy();\n s.version();\n return s.getItemCount();\n });\n\n /** Total height of all items (for scroll height) */\n readonly totalHeight = computed(() => {\n const s = this.#strategy();\n s.version();\n return s.getTotalHeight(s.getItemCount());\n });\n\n /**\n * Effective content offset: when a `vdndContentHeader` directive is projected,\n * returns the auto-measured header height. Otherwise falls back to the\n * `contentOffset` input for backward compatibility.\n */\n readonly effectiveContentOffset = computed(() => {\n const header = this.headerDirective();\n return header ? this.#measuredHeaderHeight() : this.contentOffset();\n });\n\n /**\n * Adjusted scroll position - subtracts the content offset so the virtual scroll\n * calculates visible items correctly relative to where the list starts.\n */\n readonly #adjustedScrollTop = computed(() => {\n return Math.max(0, this.#parentScrollContainer.scrollTop() - this.effectiveContentOffset());\n });\n\n /** Transform for content wrapper positioning */\n readonly contentTransform = computed(() => {\n const startIndex = this.#renderStartIndex();\n const s = this.#strategy();\n const offset = s.getOffsetForIndex(startIndex);\n return `translateY(${offset}px)`;\n });\n\n constructor() {\n this.#setupHeaderMeasurement();\n }\n\n // ========== VdndVirtualViewport Implementation ==========\n\n /** Adjusted scroll position relative to the virtual list start */\n scrollTop(): number {\n return this.#adjustedScrollTop();\n }\n\n containerHeight(): number {\n return this.#parentScrollContainer.containerHeight();\n }\n\n get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Called by VirtualForDirective to inform this viewport of the actual\n * first rendered item index. Used for wrapper positioning.\n */\n setRenderStartIndex(index: number): void {\n this.#renderStartIndex.set(index);\n }\n\n getOffsetForIndex(index: number): number {\n return this.#strategy().getOffsetForIndex(index);\n }\n\n // ========== VdndScrollContainer Implementation ==========\n\n /**\n * Scroll to a specific position, adjusting for content offset.\n */\n scrollTo(options: ScrollToOptions): void {\n const adjustedOptions = { ...options };\n if (adjustedOptions.top !== undefined) {\n // Add offset back when scrolling to ensure correct position\n adjustedOptions.top += this.effectiveContentOffset();\n }\n this.#parentScrollContainer.scrollTo(adjustedOptions);\n }\n\n // ========== Private Methods ==========\n\n /**\n * Sets up an effect that observes the projected header directive's element\n * with a ResizeObserver, keeping `#measuredHeaderHeight` in sync.\n */\n #setupHeaderMeasurement(): void {\n effect((onCleanup) => {\n const dir = this.headerDirective();\n if (!dir) {\n this.#measuredHeaderHeight.set(0);\n return;\n }\n\n const el = dir.elementRef.nativeElement;\n this.#measuredHeaderHeight.set(el.offsetHeight);\n\n let observer: ResizeObserver | null = null;\n this.#ngZone.runOutsideAngular(() => {\n observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height =\n entry.borderBoxSize?.[0]?.blockSize ?? (entry.target as HTMLElement).offsetHeight;\n this.#measuredHeaderHeight.set(height);\n }\n });\n observer.observe(el, { box: 'border-box' });\n });\n\n onCleanup(() => observer?.disconnect());\n });\n }\n}\n","import { afterNextRender, EnvironmentInjector, NgZone } from '@angular/core';\nimport { DragStateService } from '../services/drag-state.service';\nimport { KeyboardDragService } from '../services/keyboard-drag.service';\nimport { PositionCalculatorService } from '../services/position-calculator.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport { ElementCloneService } from '../services/element-clone.service';\nimport { DragEndEvent, DragStartEvent } from '../models/drag-drop.models';\n\n/**\n * Context from the directive needed for keyboard drag operations.\n */\nexport interface KeyboardDragContext {\n element: HTMLElement;\n draggableId: string;\n groupName: string | null;\n data: unknown;\n}\n\n/**\n * Callbacks from the handler back into the directive for events.\n */\nexport interface KeyboardDragCallbacks {\n onDragStart: (event: DragStartEvent) => void;\n onDragEnd: (event: DragEndEvent) => void;\n getParentDroppableId: () => string | null;\n calculateSourceIndex: (element: HTMLElement, droppableElement: HTMLElement | null) => number;\n}\n\n/**\n * Dependencies injected from the directive (non-injectable handler).\n */\nexport interface KeyboardDragDeps {\n dragState: DragStateService;\n keyboardDrag: KeyboardDragService;\n positionCalculator: PositionCalculatorService;\n dragIndexCalculator: DragIndexCalculatorService;\n elementClone: ElementCloneService;\n ngZone: NgZone;\n envInjector: EnvironmentInjector;\n callbacks: KeyboardDragCallbacks;\n getContext: () => KeyboardDragContext;\n}\n\n/**\n * Handles keyboard-initiated drag operations (Space to start, arrows to move, Space/Enter to drop).\n *\n * Extracted from DraggableDirective to encapsulate:\n * - Starting/completing/cancelling keyboard drags\n * - Document-level keyboard listener during active drag\n * - Focus restoration after drag ends\n * - Cross-list movement via arrow keys\n *\n * Provides a unified `handleKey()` method that eliminates the duplicated\n * key→action dispatch that previously existed in both host bindings and\n * a document-level listener.\n */\nexport class KeyboardDragHandler {\n readonly #deps: KeyboardDragDeps;\n #boundKeyDown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(deps: KeyboardDragDeps) {\n this.#deps = deps;\n this.#boundKeyDown = this.#onDocumentKeyDown.bind(this);\n }\n\n /**\n * Whether a keyboard drag is currently active.\n */\n isActive(): boolean {\n return this.#deps.keyboardDrag.isActive();\n }\n\n /**\n * Start a keyboard drag operation.\n */\n activate(): void {\n const ctx = this.#deps.getContext();\n if (!ctx.groupName) {\n return;\n }\n\n const element = ctx.element;\n const rect = element.getBoundingClientRect();\n\n // Find the parent droppable\n const droppableElement = this.#deps.positionCalculator.getDroppableParent(\n element,\n ctx.groupName,\n );\n if (!droppableElement) {\n return;\n }\n\n const droppableId = this.#deps.positionCalculator.getDroppableId(droppableElement);\n if (!droppableId) {\n return;\n }\n\n // Calculate source index\n const sourceIndex = this.#deps.callbacks.calculateSourceIndex(element, droppableElement);\n\n // Get total item count from the droppable\n const totalItemCount = this.#deps.dragIndexCalculator.getTotalItemCount({\n droppableElement,\n isSameList: false,\n draggedItemHeight: rect.height,\n });\n\n // Clone element BEFORE updating drag state\n const clonedElement = this.#deps.elementClone.cloneElement(element);\n\n // Start keyboard drag\n this.#deps.keyboardDrag.startKeyboardDrag(\n {\n draggableId: ctx.draggableId,\n droppableId,\n element,\n clonedElement,\n height: rect.height,\n width: rect.width,\n data: ctx.data,\n },\n sourceIndex,\n totalItemCount,\n droppableId,\n );\n\n // Add document-level keyboard listener (since element is hidden with display:none)\n this.#deps.ngZone.runOutsideAngular(() => {\n document.addEventListener('keydown', this.#boundKeyDown!);\n });\n\n // Emit drag start event\n this.#deps.callbacks.onDragStart({\n draggableId: ctx.draggableId,\n droppableId,\n data: ctx.data,\n position: { x: rect.left, y: rect.top },\n sourceIndex,\n });\n }\n\n /**\n * Unified key dispatch. Returns true if the key was handled.\n * Used by both host bindings and the document-level listener.\n */\n handleKey(event: KeyboardEvent): boolean {\n if (!this.isActive()) {\n return false;\n }\n\n switch (event.key) {\n case ' ': // Space\n case 'Enter':\n event.preventDefault();\n this.complete();\n return true;\n case 'Escape':\n case 'Tab':\n event.preventDefault();\n this.cancel();\n return true;\n case 'ArrowUp':\n event.preventDefault();\n this.#deps.keyboardDrag.moveUp();\n return true;\n case 'ArrowDown':\n event.preventDefault();\n this.#deps.keyboardDrag.moveDown();\n return true;\n case 'ArrowLeft':\n event.preventDefault();\n this.#moveToAdjacentDroppable('left');\n return true;\n case 'ArrowRight':\n event.preventDefault();\n this.#moveToAdjacentDroppable('right');\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Complete a keyboard drag operation (drop the item).\n */\n complete(): void {\n const ctx = this.#deps.getContext();\n const sourceIndex = this.#deps.dragState.sourceIndex() ?? 0;\n const destinationIndex = this.#deps.dragState.placeholderIndex();\n\n // Remove document listener\n this.#cleanupDocumentListener();\n\n // Emit drag end event\n this.#deps.callbacks.onDragEnd({\n draggableId: ctx.draggableId,\n droppableId: this.#deps.callbacks.getParentDroppableId() ?? '',\n cancelled: false,\n data: ctx.data,\n sourceIndex,\n destinationIndex,\n });\n\n this.#deps.keyboardDrag.completeKeyboardDrag();\n\n // Restore focus to the moved element after state updates\n this.#restoreFocus(ctx.draggableId);\n }\n\n /**\n * Cancel a keyboard drag operation.\n */\n cancel(): void {\n const ctx = this.#deps.getContext();\n const sourceIndex = this.#deps.dragState.sourceIndex() ?? 0;\n\n // Remove document listener\n this.#cleanupDocumentListener();\n\n // Emit drag end event\n this.#deps.callbacks.onDragEnd({\n draggableId: ctx.draggableId,\n droppableId: this.#deps.callbacks.getParentDroppableId() ?? '',\n cancelled: true,\n data: ctx.data,\n sourceIndex,\n destinationIndex: null,\n });\n\n this.#deps.keyboardDrag.cancelKeyboardDrag();\n\n // Restore focus to the original element after state updates\n this.#restoreFocus(ctx.draggableId);\n }\n\n /**\n * Teardown — remove any active document listener.\n */\n destroy(): void {\n this.#cleanupDocumentListener();\n }\n\n /**\n * Restore focus to the dragged element after keyboard drag ends.\n * Uses afterNextRender to ensure Angular has finished updating the DOM\n * (element is no longer hidden after isDragging() becomes false).\n *\n * Uses EnvironmentInjector to ensure callback runs even if the directive\n * is destroyed during cross-list moves.\n */\n #restoreFocus(draggableId: string): void {\n // Capture the destination droppable BEFORE scheduling afterNextRender\n // (the directive may be destroyed during cross-list moves)\n const destinationDroppableId = this.#deps.dragState.activeDroppableId();\n\n afterNextRender(\n () => {\n const element = document.querySelector(\n `[data-draggable-id=\"${draggableId}\"]`,\n ) as HTMLElement | null;\n\n if (element) {\n element.focus();\n } else if (destinationDroppableId) {\n // Fallback: focus the first draggable in the destination container\n const firstDraggable = document.querySelector(\n `[data-droppable-id=\"${destinationDroppableId}\"] [data-draggable-id]`,\n ) as HTMLElement | null;\n firstDraggable?.focus();\n }\n },\n { injector: this.#deps.envInjector },\n );\n }\n\n /**\n * Move to an adjacent droppable in the specified direction.\n */\n #moveToAdjacentDroppable(direction: 'left' | 'right'): void {\n const currentDroppableId = this.#deps.dragState.activeDroppableId();\n if (!currentDroppableId) {\n return;\n }\n\n const groupName = this.#deps.getContext().groupName;\n if (!groupName) {\n return;\n }\n const adjacent = this.#deps.positionCalculator.findAdjacentDroppable(\n currentDroppableId,\n direction,\n groupName,\n );\n\n if (!adjacent) {\n return;\n }\n\n // Maintain the current target index (clamped to the new list's size)\n const currentTargetIndex = this.#deps.keyboardDrag.targetIndex() ?? 0;\n const targetIndex = Math.min(currentTargetIndex, adjacent.itemCount);\n\n this.#deps.keyboardDrag.moveToDroppable(adjacent.id, targetIndex, adjacent.itemCount);\n }\n\n /**\n * Document-level keydown listener active during keyboard drag.\n */\n #onDocumentKeyDown(event: KeyboardEvent): void {\n this.handleKey(event);\n }\n\n /**\n * Remove the document-level keyboard listener.\n */\n #cleanupDocumentListener(): void {\n if (this.#boundKeyDown) {\n document.removeEventListener('keydown', this.#boundKeyDown);\n }\n }\n}\n","import { NgZone } from '@angular/core';\nimport { CursorPosition } from '../models/drag-drop.models';\n\n/**\n * Callbacks from the handler back into the directive for drag lifecycle.\n */\nexport interface PointerDragCallbacks {\n onDragStart: (position: CursorPosition) => void;\n onDragMove: (position: CursorPosition) => void;\n onDragEnd: (cancelled: boolean) => void;\n onPendingChange: (pending: boolean) => void;\n isDragging: () => boolean;\n}\n\n/**\n * Context from the directive needed for pointer drag operations.\n */\nexport interface PointerDragContext {\n element: HTMLElement;\n groupName: string | null;\n disabled: boolean;\n dragHandle: string | undefined;\n dragThreshold: number;\n dragDelay: number;\n}\n\n/**\n * Dependencies injected from the directive (non-injectable handler).\n */\nexport interface PointerDragDeps {\n ngZone: NgZone;\n callbacks: PointerDragCallbacks;\n getContext: () => PointerDragContext;\n}\n\n/**\n * Handles pointer-based (mouse + touch) drag operations.\n *\n * Extracted from DraggableDirective to encapsulate:\n * - Pointer down / move / up lifecycle\n * - Drag threshold detection\n * - Drag delay timer\n * - RAF throttling for move updates\n * - Document-level listener management\n * - Escape key cancellation during pointer drag\n */\nexport class PointerDragHandler {\n readonly #deps: PointerDragDeps;\n\n /** Starting position of the drag */\n #startPosition: CursorPosition | null = null;\n\n /** Whether we're currently tracking a potential drag */\n #isTracking = false;\n\n /** Bound event handlers for cleanup */\n #boundPointerMove: ((e: MouseEvent | TouchEvent) => void) | null = null;\n #boundPointerUp: ((e: MouseEvent | TouchEvent) => void) | null = null;\n #boundKeyDown: ((e: KeyboardEvent) => void) | null = null;\n\n /** Request animation frame ID for drag updates */\n #rafId: number | null = null;\n\n /** Timer ID for drag delay */\n #delayTimerId: ReturnType<typeof setTimeout> | null = null;\n\n /** Whether the delay has been satisfied (user held long enough) */\n #delayReady = false;\n\n constructor(deps: PointerDragDeps) {\n this.#deps = deps;\n this.#boundPointerMove = this.#onPointerMove.bind(this);\n this.#boundPointerUp = this.#onPointerUp.bind(this);\n this.#boundKeyDown = this.#onEscapeKeyDown.bind(this);\n }\n\n /**\n * The position where the user initially pressed down.\n * Used by the directive to calculate grab offset when starting drag.\n */\n getStartPosition(): CursorPosition | null {\n return this.#startPosition;\n }\n\n /**\n * Handle pointer down (mouse or touch).\n * Called from the directive's host binding.\n */\n onPointerDown(event: MouseEvent | TouchEvent, isTouch: boolean): void {\n const ctx = this.#deps.getContext();\n\n if (ctx.disabled) {\n return;\n }\n\n // Without a group, this draggable can't participate in DnD (fail gracefully).\n if (!ctx.groupName) {\n return;\n }\n\n // Check for left mouse button only\n if (!isTouch && (event as MouseEvent).button !== 0) {\n return;\n }\n\n // Check if click is on drag handle (if specified)\n if (ctx.dragHandle) {\n const target = event.target as HTMLElement;\n if (!target.closest(ctx.dragHandle)) {\n return;\n }\n }\n\n // Check for elements that should not trigger drag\n const target = event.target as HTMLElement;\n if (\n target.closest('button, input, textarea, select, [contenteditable]') ||\n target.classList.contains('no-drag')\n ) {\n return;\n }\n\n const delay = ctx.dragDelay;\n\n // For touch events with a delay configured, DON'T call preventDefault() on touchstart.\n // This allows native scrolling to work if the user swipes before the delay fires.\n // For mouse events or touch without delay, prevent default immediately to avoid\n // text selection and other default behaviors.\n if (!isTouch || delay === 0) {\n event.preventDefault();\n }\n event.stopPropagation();\n\n this.#isTracking = true;\n this.#startPosition = PointerDragHandler.#getPosition(event);\n\n // Handle drag delay\n if (delay > 0) {\n this.#delayReady = false;\n this.#delayTimerId = setTimeout(() => {\n this.#delayReady = true;\n this.#deps.callbacks.onPendingChange(true); // Emit ready state when delay passes\n this.#delayTimerId = null;\n }, delay);\n } else {\n this.#delayReady = true;\n }\n\n // Add document-level event listeners\n this.#deps.ngZone.runOutsideAngular(() => {\n if (isTouch) {\n document.addEventListener('touchmove', this.#boundPointerMove!, { passive: false });\n document.addEventListener('touchend', this.#boundPointerUp!);\n document.addEventListener('touchcancel', this.#boundPointerUp!);\n } else {\n document.addEventListener('mousemove', this.#boundPointerMove!);\n document.addEventListener('mouseup', this.#boundPointerUp!);\n }\n // Listen for Escape key on document to cancel drag\n document.addEventListener('keydown', this.#boundKeyDown!);\n });\n }\n\n /**\n * Remove listeners + cancel timers + cancel RAF.\n * Called after pointer up or when cancelling.\n */\n cleanup(): void {\n this.#isTracking = false;\n this.#startPosition = null;\n this.#deps.callbacks.onPendingChange(false); // Clear pending state on cleanup\n this.#cancelDelayTimer();\n\n if (this.#rafId !== null) {\n cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n\n // Remove event listeners\n if (this.#boundPointerMove) {\n document.removeEventListener('mousemove', this.#boundPointerMove);\n document.removeEventListener('touchmove', this.#boundPointerMove);\n }\n if (this.#boundPointerUp) {\n document.removeEventListener('mouseup', this.#boundPointerUp);\n document.removeEventListener('touchend', this.#boundPointerUp);\n document.removeEventListener('touchcancel', this.#boundPointerUp);\n }\n if (this.#boundKeyDown) {\n document.removeEventListener('keydown', this.#boundKeyDown);\n }\n }\n\n /**\n * Full teardown — cleanup + null references.\n */\n destroy(): void {\n this.cleanup();\n }\n\n /**\n * Handle pointer move (mouse or touch).\n */\n #onPointerMove(event: MouseEvent | TouchEvent): void {\n if (!this.#isTracking) {\n return;\n }\n\n const position = PointerDragHandler.#getPosition(event);\n const ctx = this.#deps.getContext();\n\n // Check if we've moved past the threshold\n if (!this.#deps.callbacks.isDragging() && this.#startPosition) {\n const distance = Math.sqrt(\n Math.pow(position.x - this.#startPosition.x, 2) +\n Math.pow(position.y - this.#startPosition.y, 2),\n );\n\n if (distance < ctx.dragThreshold) {\n return;\n }\n\n // If delay is configured and not yet ready, cancel the drag attempt\n // (user moved before the delay was satisfied).\n // DON'T call preventDefault() here - let native scrolling take over.\n if (!this.#delayReady) {\n this.#cancelDelayTimer();\n this.cleanup();\n return;\n }\n\n // Start the drag - now we can prevent default\n event.preventDefault();\n this.#deps.callbacks.onDragStart(position);\n } else if (this.#deps.callbacks.isDragging()) {\n // Already dragging - prevent default to stop scrolling\n event.preventDefault();\n }\n\n // Only update drag if we're actually dragging\n if (!this.#deps.callbacks.isDragging()) {\n return;\n }\n\n // Throttle drag updates with requestAnimationFrame\n if (this.#rafId !== null) {\n cancelAnimationFrame(this.#rafId);\n }\n\n this.#rafId = requestAnimationFrame(() => {\n this.#deps.callbacks.onDragMove(position);\n this.#rafId = null;\n });\n }\n\n /**\n * Handle pointer up (mouse or touch).\n */\n #onPointerUp(event: MouseEvent | TouchEvent): void {\n if (!this.#isTracking) {\n return;\n }\n\n // Only prevent default if we were actually dragging\n // Otherwise, allow native touch behavior (like scroll momentum) to complete\n if (this.#deps.callbacks.isDragging()) {\n event.preventDefault();\n this.#deps.callbacks.onDragEnd(false);\n }\n\n this.cleanup();\n }\n\n /**\n * Cancel the delay timer if active.\n */\n #cancelDelayTimer(): void {\n if (this.#delayTimerId !== null) {\n clearTimeout(this.#delayTimerId);\n this.#delayTimerId = null;\n }\n this.#delayReady = false;\n }\n\n /**\n * Handle keydown events on document to cancel drag with Escape.\n */\n #onEscapeKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.#deps.callbacks.isDragging()) {\n // No ngZone.run() needed - #endDrag uses signals which work outside zone\n this.#deps.callbacks.onDragEnd(true);\n this.cleanup();\n }\n }\n\n /**\n * Get position from mouse or touch event.\n */\n static #getPosition(event: MouseEvent | TouchEvent): CursorPosition {\n if ('touches' in event) {\n const touch = event.touches[0] ?? event.changedTouches[0];\n return { x: touch.clientX, y: touch.clientY };\n }\n return { x: event.clientX, y: event.clientY };\n }\n}\n","import {\n computed,\n Directive,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { DragStateService } from '../services/drag-state.service';\nimport { PositionCalculatorService } from '../services/position-calculator.service';\nimport { AutoScrollService } from '../services/auto-scroll.service';\nimport { ElementCloneService } from '../services/element-clone.service';\nimport { KeyboardDragService } from '../services/keyboard-drag.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport {\n CursorPosition,\n DragEndEvent,\n DragStartEvent,\n GrabOffset,\n} from '../models/drag-drop.models';\nimport { VDND_GROUP_TOKEN } from './droppable-group.directive';\nimport { createEffectiveGroupSignal } from '../utils/group-resolution';\nimport { KeyboardDragHandler } from '../handlers/keyboard-drag.handler';\nimport { PointerDragHandler } from '../handlers/pointer-drag.handler';\n\n/**\n * Makes an element draggable within the virtual scroll drag-and-drop system.\n *\n * @example\n * ```html\n * <!-- With explicit group -->\n * <div\n * vdndDraggable=\"item-1\"\n * vdndDraggableGroup=\"my-group\"\n * [vdndDraggableData]=\"item\">\n * Drag me!\n * </div>\n *\n * <!-- With inherited group from parent vdndGroup directive -->\n * <div vdndGroup=\"my-group\">\n * <div vdndDraggable=\"item-1\" [vdndDraggableData]=\"item\">\n * Drag me!\n * </div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndDraggable]',\n host: {\n '[attr.data-draggable-id]': 'vdndDraggable()',\n '[class.vdnd-draggable]': 'true',\n '[class.vdnd-draggable-dragging]': 'isDragging()',\n '[class.vdnd-draggable-disabled]': 'disabled()',\n '[class.vdnd-drag-pending]': 'isPending()',\n '[style.display]': 'isDragging() ? \"none\" : null',\n '[attr.aria-grabbed]': 'isDragging() ? \"true\" : \"false\"',\n '[tabindex]': 'disabled() ? -1 : 0',\n '(mousedown)': 'onPointerDown($event, false)',\n '(touchstart)': 'onPointerDown($event, true)',\n '(keydown.space)': 'onKeyboardActivate($event)',\n '(keydown.enter)': 'onEnterKey($event)',\n '(keydown.arrowup)': 'onArrowKey($event)',\n '(keydown.arrowdown)': 'onArrowKey($event)',\n '(keydown.arrowleft)': 'onArrowKey($event)',\n '(keydown.arrowright)': 'onArrowKey($event)',\n '(keydown.escape)': 'onEscape()',\n },\n})\nexport class DraggableDirective implements OnInit, OnDestroy {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #dragState = inject(DragStateService);\n readonly #positionCalculator = inject(PositionCalculatorService);\n readonly #autoScroll = inject(AutoScrollService);\n readonly #elementClone = inject(ElementCloneService);\n readonly #keyboardDrag = inject(KeyboardDragService);\n readonly #dragIndexCalculator = inject(DragIndexCalculatorService);\n readonly #ngZone = inject(NgZone);\n readonly #envInjector = inject(EnvironmentInjector);\n readonly #parentGroup = inject(VDND_GROUP_TOKEN, { optional: true });\n\n /** Unique identifier for this draggable */\n vdndDraggable = input.required<string>();\n\n /**\n * Drag-and-drop group name.\n * Optional when a parent `vdndGroup` directive provides the group context.\n */\n vdndDraggableGroup = input<string>();\n\n /**\n * Resolved group name - uses explicit input or falls back to parent group.\n * Returns null (and disables drag) if neither is available.\n */\n readonly #effectiveGroup = createEffectiveGroupSignal({\n explicitGroup: this.vdndDraggableGroup,\n parentGroup: this.#parentGroup,\n elementId: this.vdndDraggable,\n elementType: 'draggable',\n });\n\n /** Optional data associated with this draggable */\n vdndDraggableData = input<unknown>();\n\n /** Whether this draggable is disabled */\n disabled = input<boolean>(false);\n\n /** CSS selector for drag handle (if not provided, entire element is draggable) */\n dragHandle = input<string>();\n\n /** Minimum distance to move before drag starts (prevents accidental drags) */\n dragThreshold = input<number>(5);\n\n /**\n * Delay in milliseconds before drag starts after pointer down.\n * User must hold without moving for this duration.\n * Set to 0 for immediate drag (default behavior).\n */\n dragDelay = input<number>(0);\n\n /** Lock dragging to a single axis ('x' = horizontal only, 'y' = vertical only) */\n lockAxis = input<'x' | 'y' | null>(null);\n\n /** Emits when drag starts */\n dragStart = output<DragStartEvent>();\n\n /** Emits when drag ends */\n dragEnd = output<DragEndEvent>();\n\n /** Whether this element is in the \"ready to drag\" state (delay has passed) */\n #isPending = signal(false);\n readonly isPending = this.#isPending.asReadonly();\n\n /** Whether this element is currently being dragged (based on global drag state) */\n readonly isDragging = computed(() => {\n const draggedItem = this.#dragState.draggedItem();\n return draggedItem?.draggableId === this.vdndDraggable();\n });\n\n #keyboardHandler!: KeyboardDragHandler;\n #pointerHandler!: PointerDragHandler;\n\n /** Cached constraint flag from source droppable */\n #constrainToContainer = false;\n\n /** Element whose rect is used for clamping (scroll container or droppable itself) */\n #constraintElement: HTMLElement | null = null;\n\n /** Last raw pointer position from pointer move events (not clamped) */\n #lastRawPosition: CursorPosition | null = null;\n\n /**\n * Update the pending state and emit the change event.\n */\n #setPending(pending: boolean): void {\n if (this.#isPending() !== pending) {\n this.#isPending.set(pending);\n }\n }\n\n /**\n * Find the element to use for container constraint clamping.\n * If the droppable is inside a scrollable container, use that container's rect\n * (which represents the visible viewport) instead of the droppable's rect\n * (which may extend far beyond the viewport in virtual scroll scenarios).\n */\n #findConstraintElement(droppableElement: HTMLElement | null): HTMLElement | null {\n if (!droppableElement) return null;\n const scrollable = droppableElement.closest('.vdnd-scrollable');\n return (scrollable as HTMLElement) ?? droppableElement;\n }\n\n ngOnInit(): void {\n this.#keyboardHandler = new KeyboardDragHandler({\n dragState: this.#dragState,\n keyboardDrag: this.#keyboardDrag,\n positionCalculator: this.#positionCalculator,\n dragIndexCalculator: this.#dragIndexCalculator,\n elementClone: this.#elementClone,\n ngZone: this.#ngZone,\n envInjector: this.#envInjector,\n callbacks: {\n onDragStart: (event) => this.dragStart.emit(event),\n onDragEnd: (event) => this.dragEnd.emit(event),\n getParentDroppableId: () => this.#getParentDroppableId(),\n calculateSourceIndex: (el, droppable) => this.#calculateSourceIndex(el, droppable),\n },\n getContext: () => ({\n element: this.#elementRef.nativeElement,\n draggableId: this.vdndDraggable(),\n groupName: this.#effectiveGroup(),\n data: this.vdndDraggableData(),\n }),\n });\n\n this.#pointerHandler = new PointerDragHandler({\n ngZone: this.#ngZone,\n callbacks: {\n onDragStart: (position) => this.#startDrag(position),\n onDragMove: (position) => {\n this.#lastRawPosition = position;\n this.#updateDrag(position);\n },\n onDragEnd: (cancelled) => this.#endDrag(cancelled),\n onPendingChange: (pending) => this.#setPending(pending),\n isDragging: () => this.isDragging(),\n },\n getContext: () => ({\n element: this.#elementRef.nativeElement,\n groupName: this.#effectiveGroup(),\n disabled: this.disabled(),\n dragHandle: this.dragHandle(),\n dragThreshold: this.dragThreshold(),\n dragDelay: this.dragDelay(),\n }),\n });\n }\n\n ngOnDestroy(): void {\n // If destroyed mid-drag, cancel to avoid stale global state / ongoing RAF loops.\n if (this.isDragging()) {\n this.#endDrag(true);\n }\n this.#pointerHandler.destroy();\n this.#keyboardHandler.destroy();\n }\n\n /**\n * Handle pointer down (mouse or touch).\n */\n protected onPointerDown(event: MouseEvent | TouchEvent, isTouch: boolean): void {\n this.#pointerHandler.onPointerDown(event, isTouch);\n }\n\n /**\n * Handle keyboard activation (space key).\n * Starts a keyboard drag if not dragging, or drops if already in keyboard drag mode.\n */\n protected onKeyboardActivate(event: Event): void {\n if (this.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation(); // Prevent document listener from receiving this event\n\n // If we're in a keyboard drag, Space drops the item\n if (this.#keyboardHandler.isActive()) {\n this.#keyboardHandler.complete();\n return;\n }\n\n // If we're in a pointer drag, ignore\n if (this.isDragging()) {\n return;\n }\n\n // Start keyboard drag\n this.#keyboardHandler.activate();\n }\n\n /**\n * Handle Enter key (alternative to Space for dropping during keyboard drag).\n */\n protected onEnterKey(event: Event): void {\n if (this.#keyboardHandler.isActive()) {\n event.preventDefault();\n this.#keyboardHandler.complete();\n }\n }\n\n /**\n * Handle arrow keys during keyboard drag.\n */\n protected onArrowKey(event: Event): void {\n if (this.#keyboardHandler.isActive()) {\n this.#keyboardHandler.handleKey(event as KeyboardEvent);\n }\n }\n\n /**\n * Handle escape key to cancel drag (host binding, fires before element is hidden).\n */\n protected onEscape(): boolean {\n if (this.#keyboardHandler.isActive()) {\n this.#keyboardHandler.cancel();\n return false;\n }\n if (this.isDragging()) {\n this.#endDrag(true);\n this.#pointerHandler.cleanup();\n return false; // Prevents default\n }\n return true;\n }\n\n /**\n * Start the drag operation.\n */\n #startDrag(position: CursorPosition): void {\n // Clear pending state - drag is now active\n this.#setPending(false);\n\n const element = this.#elementRef.nativeElement;\n const rect = element.getBoundingClientRect();\n\n // Calculate grab offset using the START position (where user initially pressed down)\n // NOT the current position (where drag threshold was exceeded)\n // This ensures the preview maintains its position relative to where the user grabbed it\n const startPos = this.#pointerHandler.getStartPosition() ?? position;\n const grabOffset: GrabOffset = {\n x: startPos.x - rect.left,\n y: startPos.y - rect.top,\n };\n\n // Clone element BEFORE updating drag state (which triggers display:none via host binding)\n const clonedElement = this.#elementClone.cloneElement(element);\n\n const parentDroppableId = this.#getParentDroppableId();\n\n // Find droppable and calculate initial placeholder position\n // This fixes the UI glitch by ensuring placeholder is set before the element is hidden\n const groupName = this.#effectiveGroup();\n if (!groupName) {\n // Misconfigured - cancel tracking and don't start drag.\n this.#pointerHandler.cleanup();\n return;\n }\n const droppableElement = this.#positionCalculator.findDroppableAtPoint(\n position.x,\n position.y,\n element,\n groupName,\n );\n\n // Cache constraint flag and element for clamping during drag\n this.#constrainToContainer =\n droppableElement?.hasAttribute('data-constrain-to-container') ?? false;\n this.#constraintElement = this.#constrainToContainer\n ? this.#findConstraintElement(droppableElement)\n : null;\n\n const activeDroppableId = droppableElement\n ? this.#positionCalculator.getDroppableId(droppableElement)\n : parentDroppableId;\n\n // Calculate source index BEFORE the element is hidden (display: none)\n // This is critical because getBoundingClientRect() returns all zeros for hidden elements\n const sourceIndex = this.#calculateSourceIndex(element, droppableElement);\n\n let initialPlaceholderId: string | null = null;\n let initialPlaceholderIndex: number | null = null;\n\n if (droppableElement) {\n const indexResult = this.#dragIndexCalculator.calculatePlaceholderIndex({\n droppableElement,\n position,\n previousPosition: null,\n grabOffset,\n draggedItemHeight: rect.height,\n sourceDroppableId: parentDroppableId,\n sourceIndex,\n });\n initialPlaceholderIndex = indexResult.index;\n initialPlaceholderId = indexResult.placeholderId;\n }\n\n const lockAxis = this.lockAxis();\n\n // Register with drag state service - this triggers isDragging computed to become true\n // which will apply display:none via host binding\n // No ngZone.run() needed - signals work outside zone and effects react automatically\n this.#dragState.startDrag(\n {\n draggableId: this.vdndDraggable(),\n droppableId: parentDroppableId ?? '',\n element,\n clonedElement,\n height: rect.height,\n width: rect.width,\n data: this.vdndDraggableData(),\n },\n position,\n grabOffset,\n lockAxis,\n activeDroppableId,\n initialPlaceholderId,\n initialPlaceholderIndex,\n sourceIndex,\n undefined,\n lockAxis ? startPos : undefined,\n );\n\n // Start auto-scroll monitoring with a callback to recalculate placeholder\n this.#autoScroll.startMonitoring(() => this.#recalculatePlaceholder());\n\n // Emit drag start event\n this.dragStart.emit({\n draggableId: this.vdndDraggable(),\n droppableId: parentDroppableId ?? '',\n data: this.vdndDraggableData(),\n position,\n sourceIndex,\n });\n }\n\n /**\n * Calculate the source index of the dragged element BEFORE it's hidden.\n * This must be called before startDrag updates the state (which triggers display:none).\n * Uses strategy-based lookup when available for accurate handling of variable heights.\n */\n #calculateSourceIndex(element: HTMLElement, droppableElement: HTMLElement | null): number {\n if (!droppableElement) {\n return 0;\n }\n\n const rect = element.getBoundingClientRect();\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n const virtualContent = droppableElement.matches('vdnd-virtual-content')\n ? droppableElement\n : droppableElement.closest('vdnd-virtual-content');\n\n let containerRect: DOMRect;\n let scrollTop: number;\n\n if (virtualScroll) {\n containerRect = (virtualScroll as HTMLElement).getBoundingClientRect();\n scrollTop = (virtualScroll as HTMLElement).scrollTop;\n } else if (virtualContent) {\n // Page-level scroll: use scrollable parent rect + content offset so that\n // relativeY is measured from the start of the virtual items, not the header.\n const scrollableParent = virtualContent.closest('.vdnd-scrollable') as HTMLElement | null;\n if (scrollableParent) {\n containerRect = scrollableParent.getBoundingClientRect();\n const contentOffsetAttr = (virtualContent as HTMLElement).getAttribute(\n 'data-content-offset',\n );\n const contentOffset = contentOffsetAttr ? parseFloat(contentOffsetAttr) : 0;\n scrollTop =\n scrollableParent.scrollTop - (Number.isFinite(contentOffset) ? contentOffset : 0);\n } else {\n containerRect = (virtualContent as HTMLElement).getBoundingClientRect();\n scrollTop = 0;\n }\n } else {\n containerRect = droppableElement.getBoundingClientRect();\n scrollTop = droppableElement.scrollTop;\n }\n\n // Try to use registered strategy for accurate offset-based lookup\n const droppableId = this.#positionCalculator.getDroppableId(droppableElement);\n if (droppableId) {\n const strategy = this.#dragIndexCalculator.getStrategyForDroppable(droppableId);\n if (strategy) {\n const relativeY = rect.top - containerRect.top + scrollTop;\n return strategy.findIndexAtOffset(relativeY);\n }\n }\n\n // Fallback: Use fixed-height math if no strategy available\n const itemHeight = rect.height || 50;\n const relativeY = rect.top - containerRect.top + scrollTop;\n return Math.round(relativeY / itemHeight);\n }\n\n /**\n * Recalculate placeholder position (called during auto-scroll).\n */\n #recalculatePlaceholder(): void {\n const cursorPosition = this.#dragState.cursorPosition();\n if (!cursorPosition || !this.isDragging()) {\n return;\n }\n\n // Recalculate placeholder based on current scroll position\n this.#updateDrag(cursorPosition);\n }\n\n /**\n * Clamp cursor position to source container boundaries when constrainToContainer is enabled.\n */\n #clampToContainer(position: CursorPosition): CursorPosition {\n if (!this.#constrainToContainer || !this.#constraintElement) {\n return position;\n }\n\n const containerRect = this.#constraintElement.getBoundingClientRect();\n const grabOffset = this.#dragState.grabOffset();\n if (!grabOffset) {\n return position;\n }\n\n const draggedItem = this.#dragState.draggedItem();\n const itemHeight = draggedItem?.height ?? 0;\n const itemWidth = draggedItem?.width ?? 0;\n\n const minY = containerRect.top + grabOffset.y + 1;\n const maxY = containerRect.bottom - (itemHeight - grabOffset.y) - 1;\n const minX = containerRect.left + grabOffset.x + 1;\n const maxX = containerRect.right - (itemWidth - grabOffset.x) - 1;\n\n return {\n x: Math.max(minX, Math.min(position.x, maxX)),\n y: Math.max(minY, Math.min(position.y, maxY)),\n };\n }\n\n /**\n * Update the drag position.\n * @param position Current cursor position\n */\n #updateDrag(position: CursorPosition): void {\n const element = this.#elementRef.nativeElement;\n const groupName = this.#effectiveGroup();\n if (!groupName) {\n // Group became unavailable mid-drag; cancel to avoid inconsistent state.\n this.#endDrag(true);\n this.#pointerHandler.cleanup();\n return;\n }\n\n // Apply axis locking to effective position for droppable detection\n // When axis is locked, use the start position for the locked axis\n const axisLock = this.lockAxis();\n const startPos = this.#pointerHandler.getStartPosition();\n let effectivePosition = position;\n\n if (axisLock && startPos) {\n effectivePosition = {\n x: axisLock === 'x' ? startPos.x : position.x,\n y: axisLock === 'y' ? startPos.y : position.y,\n };\n }\n\n // Apply container clamping after axis locking\n effectivePosition = this.#clampToContainer(effectivePosition);\n\n // Update autoscroll cursor: use raw pointer position clamped to container\n // edges (without grabOffset) so autoscroll threshold is reachable regardless\n // of where the user grabbed the item.\n if (this.#constrainToContainer && this.#constraintElement && this.#lastRawPosition) {\n const rect = this.#constraintElement.getBoundingClientRect();\n let scrollCursor: CursorPosition = this.#lastRawPosition;\n if (axisLock && startPos) {\n scrollCursor = {\n x: axisLock === 'x' ? startPos.x : scrollCursor.x,\n y: axisLock === 'y' ? startPos.y : scrollCursor.y,\n };\n }\n this.#autoScroll.setCursorOverride({\n x: Math.max(rect.left, Math.min(scrollCursor.x, rect.right)),\n y: Math.max(rect.top, Math.min(scrollCursor.y, rect.bottom)),\n });\n }\n\n // Find droppable at effective position (respects axis locking and clamping)\n const droppableElement = this.#positionCalculator.findDroppableAtPoint(\n effectivePosition.x,\n effectivePosition.y,\n element,\n groupName,\n );\n\n const activeDroppableId = droppableElement\n ? this.#positionCalculator.getDroppableId(droppableElement)\n : null;\n\n let placeholderId: string | null = null;\n let placeholderIndex: number | null = null;\n\n if (droppableElement) {\n // Calculate placeholder index based on effective position using mathematical approach\n // This is more stable than DOM-based detection because it doesn't get affected\n // by the placeholder insertion shifting elements around\n const draggedItemHeight = this.#dragState.draggedItem()?.height ?? 50;\n const indexResult = this.#dragIndexCalculator.calculatePlaceholderIndex({\n droppableElement,\n position: effectivePosition,\n previousPosition: this.#dragState.cursorPosition(),\n grabOffset: this.#dragState.grabOffset(),\n draggedItemHeight,\n sourceDroppableId: this.#dragState.sourceDroppableId(),\n sourceIndex: this.#dragState.sourceIndex(),\n });\n placeholderIndex = indexResult.index;\n placeholderId = indexResult.placeholderId;\n }\n\n // Update drag state with effective position (respects axis locking and container clamping)\n // No ngZone.run() needed - signals work outside zone and effects react automatically\n this.#dragState.updateDragPosition({\n cursorPosition: effectivePosition,\n activeDroppableId,\n placeholderId,\n placeholderIndex,\n });\n }\n\n /**\n * End the drag operation.\n */\n #endDrag(cancelled: boolean): void {\n // No ngZone.run() needed - signals work outside zone and effects react automatically\n // Stop auto-scroll monitoring\n this.#autoScroll.stopMonitoring();\n\n // Reset cached constraint state\n this.#constrainToContainer = false;\n this.#constraintElement = null;\n this.#lastRawPosition = null;\n\n const sourceIndex = this.#dragState.sourceIndex() ?? 0;\n const placeholderIndex = this.#dragState.placeholderIndex();\n let destinationIndex = cancelled ? null : placeholderIndex;\n\n // Keep DragEndEvent semantics consistent with DropEvent.destination.index.\n // During same-list drag, placeholderIndex includes the hidden-item adjustment,\n // but the final insertion index must account for removal of the source item.\n if (!cancelled && placeholderIndex !== null) {\n const sourceDroppableId = this.#dragState.sourceDroppableId();\n const activeDroppableId = this.#dragState.activeDroppableId();\n if (sourceDroppableId !== null && sourceDroppableId === activeDroppableId) {\n if (sourceIndex < placeholderIndex) {\n destinationIndex = placeholderIndex - 1;\n }\n }\n }\n\n // Emit drag end event\n this.dragEnd.emit({\n draggableId: this.vdndDraggable(),\n droppableId: this.#getParentDroppableId() ?? '',\n cancelled,\n data: this.vdndDraggableData(),\n sourceIndex,\n destinationIndex,\n });\n\n // Clear drag state - this triggers isDragging computed to become false\n if (cancelled) {\n this.#dragState.cancelDrag();\n } else {\n this.#dragState.endDrag();\n }\n }\n\n /**\n * Get the parent droppable ID.\n */\n #getParentDroppableId(): string | null {\n const groupName = this.#effectiveGroup();\n if (!groupName) {\n return null;\n }\n\n const droppable = this.#positionCalculator.getDroppableParent(\n this.#elementRef.nativeElement,\n groupName,\n );\n\n return droppable ? this.#positionCalculator.getDroppableId(droppable) : null;\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n} from '@angular/core';\nimport { VDND_SCROLL_CONTAINER, VdndScrollContainer } from '../tokens/scroll-container.token';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport {\n bindRafThrottledScrollTopSignal,\n bindResizeObserverHeightSignal,\n} from '../utils/dom-signal-bindings';\n\n/**\n * Directive that marks an element as a scrollable container for virtual scrolling.\n *\n * Apply this directive to any scrollable element (with `overflow: auto` or `overflow: scroll`)\n * that contains a `*vdndVirtualFor` directive. The virtual scroll will use this element\n * as its scroll container.\n *\n * @example\n * Basic usage with a custom scroll container:\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </div>\n * ```\n *\n * @example\n * With Ionic ion-content:\n * ```html\n * <ion-content vdndScrollable class=\"ion-content-scroll-host\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </ion-content>\n * ```\n *\n * @example\n * With auto-scroll configuration:\n * ```html\n * <div vdndScrollable\n * [autoScrollEnabled]=\"true\"\n * [autoScrollConfig]=\"{ threshold: 80, maxSpeed: 20 }\"\n * style=\"overflow: auto; height: 400px;\">\n * ...\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndScrollable]',\n providers: [{ provide: VDND_SCROLL_CONTAINER, useExisting: ScrollableDirective }],\n host: {\n class: 'vdnd-scrollable',\n '[style.overflow-anchor]': '\"none\"',\n },\n})\nexport class ScrollableDirective implements VdndScrollContainer, OnInit, OnDestroy {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #ngZone = inject(NgZone);\n readonly #autoScrollService = inject(AutoScrollService);\n\n /** Current scroll position (reactive) */\n readonly #scrollTop = signal(0);\n\n /** Measured container height (reactive) */\n readonly #containerHeight = signal(0);\n\n /** Cleanup function for scroll listener */\n #scrollCleanup: (() => void) | null = null;\n #resizeCleanup: (() => void) | null = null;\n\n /** Generated ID for auto-scroll registration */\n #generatedScrollId = `vdnd-scroll-${Math.random().toString(36).slice(2, 9)}`;\n\n // ========== Inputs ==========\n\n /** Unique ID for this scroll container (used for auto-scroll registration) */\n scrollContainerId = input<string>();\n\n /** Whether auto-scroll is enabled when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n // ========== VdndScrollContainer Implementation ==========\n\n get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n scrollTop(): number {\n return this.#scrollTop();\n }\n\n scrollTo(options: ScrollToOptions): void {\n this.nativeElement.scrollTo(options);\n }\n\n // ========== Additional API ==========\n\n /** Get the measured container height */\n containerHeight(): number {\n return this.#containerHeight();\n }\n\n /** Scroll by a delta amount */\n scrollBy(delta: number): void {\n const newPosition = Math.max(\n 0,\n Math.min(\n this.scrollTop() + delta,\n this.nativeElement.scrollHeight - this.nativeElement.clientHeight,\n ),\n );\n this.scrollTo({ top: newPosition });\n }\n\n // ========== Lifecycle ==========\n\n ngOnInit(): void {\n this.#setupScrollListener();\n this.#setupResizeObserver();\n this.#registerAutoScroll();\n }\n\n ngOnDestroy(): void {\n this.#scrollCleanup?.();\n this.#resizeCleanup?.();\n this.#unregisterAutoScroll();\n }\n\n // ========== Private Methods ==========\n\n /** Minimum scroll delta (px) to trigger signal update */\n readonly #scrollThreshold = 5;\n\n #setupScrollListener(): void {\n this.#scrollCleanup = bindRafThrottledScrollTopSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n scrollTop: this.#scrollTop,\n thresholdPx: this.#scrollThreshold,\n });\n }\n\n #setupResizeObserver(): void {\n this.#resizeCleanup = bindResizeObserverHeightSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n height: this.#containerHeight,\n minDeltaPx: 1,\n });\n }\n\n #registerAutoScroll(): void {\n if (this.autoScrollEnabled()) {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.registerContainer(id, this.nativeElement, this.autoScrollConfig());\n }\n }\n\n #unregisterAutoScroll(): void {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.unregisterContainer(id);\n }\n}\n","import {\n computed,\n Directive,\n effect,\n ElementRef,\n EmbeddedViewRef,\n inject,\n Injector,\n input,\n isDevMode,\n NgZone,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { VDND_SCROLL_CONTAINER } from '../tokens/scroll-container.token';\nimport { VDND_VIRTUAL_VIEWPORT } from '../tokens/virtual-viewport.token';\nimport { DragStateService } from '../services/drag-state.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport { DroppableDirective } from './droppable.directive';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\n\n/**\n * Context provided to the template for each virtual item.\n */\nexport interface VirtualForContext<T> {\n /** The item data (also available as implicit context) */\n $implicit: T;\n /** The item's index in the original array */\n index: number;\n /** Whether this is the first visible item */\n first: boolean;\n /** Whether this is the last visible item */\n last: boolean;\n /** Count of total items */\n count: number;\n}\n\n/**\n * Represents an item entry in the render queue for virtual scrolling.\n * @internal\n */\ninterface RenderEntry<T> {\n type: 'item' | 'placeholder';\n key: unknown;\n context: VirtualForContext<T> | null;\n visualIndex: number;\n}\n\n/**\n * A structural directive for virtual scrolling within custom scroll containers.\n * Provides maximum flexibility for advanced use cases where the component wrapper\n * is not suitable.\n *\n * The directive must be placed inside a container marked with the `vdndScrollable`\n * directive, which provides the scroll container context via dependency injection.\n *\n * Placeholders are handled automatically by the parent component (vdnd-virtual-scroll\n * or vdnd-virtual-content) - consumers just render their items normally.\n *\n * @example\n * Inside a viewport component (itemHeight and droppableId inherited automatically):\n * ```html\n * <vdnd-virtual-viewport [itemHeight]=\"50\" style=\"height: 400px\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-viewport>\n * ```\n *\n * @example\n * Standalone usage (itemHeight required):\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 400px\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndVirtualFor][vdndVirtualForOf]',\n})\nexport class VirtualForDirective<T> implements OnInit, OnDestroy {\n readonly #templateRef = inject(TemplateRef<VirtualForContext<T>>);\n readonly #viewContainer = inject(ViewContainerRef);\n readonly #elementRef = inject(ElementRef<Comment>);\n readonly #scrollContainer = inject(VDND_SCROLL_CONTAINER);\n readonly #injector = inject(Injector);\n readonly #ngZone = inject(NgZone);\n readonly #dragState = inject(DragStateService);\n readonly #dragIndexCalculator = inject(DragIndexCalculatorService);\n\n /**\n * Optional viewport component that provides wrapper-based positioning.\n * When inside a viewport, items are positioned via the wrapper's transform,\n * so we skip individual absolute positioning.\n */\n readonly #viewport = inject(VDND_VIRTUAL_VIEWPORT, { optional: true });\n\n /**\n * Optional parent droppable directive.\n * When present, droppableId is inherited automatically.\n */\n readonly #droppable = inject(DroppableDirective, { optional: true });\n\n /** Whether we're inside a viewport component (use wrapper positioning) */\n readonly #useViewportPositioning = this.#viewport !== null;\n\n /** Pool of views for reuse */\n readonly #viewPool: EmbeddedViewRef<VirtualForContext<T>>[] = [];\n\n /** Currently active views keyed by their track-by value */\n readonly #activeViews = new Map<unknown, EmbeddedViewRef<VirtualForContext<T>>>();\n\n /** Single spacer element for scroll height */\n #spacer: HTMLDivElement | null = null;\n\n /** Placeholder element for drag operations */\n #placeholder: HTMLDivElement | null = null;\n\n /** Whether placeholder is currently in the DOM */\n #placeholderInDom = false;\n\n /** ResizeObserver for dynamic height measurement */\n #resizeObserver: ResizeObserver | null = null;\n\n /** Map from observed HTMLElement to its trackBy key */\n readonly #observedElements = new WeakMap<HTMLElement, unknown>();\n\n // ========== Inputs ==========\n\n /** The array of items to iterate over */\n vdndVirtualForOf = input.required<T[]>();\n\n /**\n * Height of each item in pixels (used as estimate in dynamic mode).\n * Optional when inside a viewport component — inherited from the viewport's strategy.\n */\n vdndVirtualForItemHeight = input<number>();\n\n /** Track-by function for efficient updates */\n vdndVirtualForTrackBy = input.required<(index: number, item: T) => unknown>();\n\n /** Number of items to render outside the visible area */\n vdndVirtualForOverscan = input<number>(3);\n\n /**\n * ID of the droppable this directive belongs to.\n * Required for placeholder positioning during drag operations.\n */\n vdndVirtualForDroppableId = input<string>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n vdndVirtualForDynamicItemHeight = input<boolean>(false);\n\n // ========== Resolved Values ==========\n\n /**\n * Effective droppable ID — uses explicit input or inherits from parent DroppableDirective.\n */\n readonly #effectiveDroppableId = computed(() => {\n return this.vdndVirtualForDroppableId() ?? this.#droppable?.vdndDroppable() ?? undefined;\n });\n\n // ========== Strategy ==========\n\n /**\n * The virtual scroll strategy.\n * If inside a viewport that has a strategy, use that. Otherwise create our own.\n */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n // If viewport provides a strategy, use it (shared state for drag-drop)\n const viewportStrategy = this.#viewport?.strategy;\n if (viewportStrategy) return viewportStrategy;\n\n // Create our own strategy (standalone mode — itemHeight is required)\n const height = this.vdndVirtualForItemHeight();\n if (height === undefined) {\n if (isDevMode()) {\n console.warn(\n '[ngx-virtual-dnd] vdndVirtualFor requires itemHeight when not inside a viewport component ' +\n '(vdnd-virtual-viewport or vdnd-virtual-content). Falling back to 50px.',\n );\n }\n return new FixedHeightStrategy(50);\n }\n return this.vdndVirtualForDynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n // ========== Placeholder Computed Values ==========\n\n /** Whether the placeholder should be shown in this container */\n readonly #shouldShowPlaceholder = computed(() => {\n const droppableId = this.#effectiveDroppableId();\n if (!droppableId) return false;\n if (!this.#dragState.isDragging()) return false;\n return this.#dragState.activeDroppableId() === droppableId;\n });\n\n /** The placeholder index when placeholder should be shown */\n readonly #placeholderIndex = computed(() => {\n if (!this.#shouldShowPlaceholder()) return -1;\n return this.#dragState.placeholderIndex() ?? -1;\n });\n\n // ========== Computed Values ==========\n\n /** First visible item index */\n readonly #firstVisibleIndex = computed(() => {\n const strategy = this.#strategy();\n // Read version to subscribe to dynamic height changes\n strategy.version();\n return strategy.getFirstVisibleIndex(this.#scrollContainer.scrollTop());\n });\n\n /** Number of visible items */\n readonly #visibleCount = computed(() => {\n const height = this.#scrollContainer.containerHeight();\n const strategy = this.#strategy();\n strategy.version();\n const startIndex = this.#firstVisibleIndex();\n return strategy.getVisibleCount(startIndex, height);\n });\n\n /** Range of items to render */\n readonly #renderRange = computed(() => {\n const first = this.#firstVisibleIndex();\n const visible = this.#visibleCount();\n const overscan = this.vdndVirtualForOverscan();\n const total = this.vdndVirtualForOf().length;\n\n const start = Math.max(0, first - overscan);\n const end = Math.min(total - 1, first + visible + overscan);\n\n return { start, end };\n });\n\n /** Map of trackBy keys to item indices for quick lookup */\n readonly #itemIndexMap = computed(() => {\n const items = this.vdndVirtualForOf();\n const trackByFn = this.vdndVirtualForTrackBy();\n const map = new Map<unknown, number>();\n for (let i = 0; i < items.length; i++) {\n map.set(trackByFn(i, items[i]), i);\n }\n return map;\n });\n\n /** Index of the dragged item in this list (-1 if not present or not dragging) */\n readonly #draggedItemIndex = computed(() => {\n const draggedItem = this.#dragState.draggedItem();\n if (!draggedItem) return -1;\n\n const byId = this.#itemIndexMap().get(draggedItem.draggableId);\n if (byId !== undefined) {\n return byId;\n }\n\n const data = draggedItem.data as T | null | undefined;\n if (data !== null && data !== undefined) {\n return this.vdndVirtualForOf().indexOf(data);\n }\n\n return -1;\n });\n\n constructor() {\n // Keep strategy item keys in sync\n effect(() => {\n const items = this.vdndVirtualForOf();\n const trackByFn = this.vdndVirtualForTrackBy();\n const keys = items.map((item, i) => trackByFn(i, item));\n this.#strategy().setItemKeys(keys);\n });\n\n // Register strategy with drag index calculator for accurate position lookups\n effect((onCleanup) => {\n const droppableId = this.#effectiveDroppableId();\n const strategy = this.#strategy();\n if (droppableId) {\n this.#dragIndexCalculator.registerStrategy(droppableId, strategy);\n onCleanup(() => this.#dragIndexCalculator.unregisterStrategy(droppableId));\n }\n });\n\n // Set excluded index persistently during same-list drag.\n // This ensures ALL strategy methods (getTotalHeight, getOffsetForIndex, etc.)\n // correctly skip the hidden item — not just findIndexAtOffset.\n effect(() => {\n const strategy = this.#strategy();\n const draggedIndex = this.#draggedItemIndex();\n const droppableId = this.#effectiveDroppableId();\n const sourceDroppableId = this.#dragState.sourceDroppableId();\n const isDragging = this.#dragState.isDragging();\n\n const isSourceList =\n isDragging && droppableId !== undefined && droppableId === sourceDroppableId;\n\n if (isSourceList && draggedIndex >= 0) {\n strategy.setExcludedIndex(draggedIndex);\n } else {\n strategy.setExcludedIndex(null);\n }\n });\n\n // React to changes and update views\n effect(() => {\n this.#updateViews();\n });\n }\n\n ngOnInit(): void {\n // Only create spacer when NOT inside a viewport component\n // (viewport provides its own spacer and wrapper positioning)\n if (!this.#useViewportPositioning) {\n this.#updateSpacers();\n }\n\n // Create placeholder element for drag operations\n this.#createPlaceholder();\n\n // Set up ResizeObserver for dynamic height mode.\n // Check both the directive's own input and the viewport's strategy (when inherited).\n if (\n this.vdndVirtualForDynamicItemHeight() ||\n this.#strategy() instanceof DynamicHeightStrategy\n ) {\n this.#setupResizeObserver();\n }\n }\n\n ngOnDestroy(): void {\n this.#viewPool.forEach((view) => view.destroy());\n this.#activeViews.forEach((view) => view.destroy());\n\n // Clean up spacer element (only if we created one)\n this.#spacer?.remove();\n\n // Clean up placeholder element\n this.#placeholder?.remove();\n\n // Clean up ResizeObserver\n this.#resizeObserver?.disconnect();\n }\n\n /**\n * Create the placeholder element for drag operations.\n */\n #createPlaceholder(): void {\n const placeholder = document.createElement('div');\n placeholder.className = 'vdnd-drag-placeholder vdnd-drag-placeholder-visible';\n placeholder.style.cssText = 'display: block; pointer-events: none;';\n this.#placeholder = placeholder;\n }\n\n /**\n * Set up spacer element for scroll height.\n */\n #updateSpacers(): void {\n // Create single spacer that maintains total scroll height\n const spacer = document.createElement('div');\n spacer.className = 'vdnd-virtual-for-spacer';\n spacer.style.cssText =\n 'position: absolute; top: 0; left: 0; width: 1px; visibility: hidden; pointer-events: none;';\n\n // Insert spacer before the directive's anchor comment\n const comment = this.#elementRef.nativeElement;\n comment.parentNode?.insertBefore(spacer, comment);\n\n this.#spacer = spacer;\n\n // Update spacer height reactively\n // Must pass injector since we're outside constructor\n effect(\n () => {\n const total = this.vdndVirtualForOf().length;\n const strategy = this.#strategy();\n strategy.version();\n\n // Single spacer with full content height\n spacer.style.height = `${strategy.getTotalHeight(total)}px`;\n },\n { injector: this.#injector },\n );\n }\n\n /**\n * Set up ResizeObserver for dynamic height measurement.\n */\n #setupResizeObserver(): void {\n this.#ngZone.runOutsideAngular(() => {\n this.#resizeObserver = new ResizeObserver((entries) => {\n const strategy = this.#strategy();\n for (const entry of entries) {\n const element = entry.target as HTMLElement;\n const key = this.#observedElements.get(element);\n if (key === undefined) continue;\n\n const height = entry.borderBoxSize?.[0]?.blockSize ?? element.offsetHeight;\n if (height > 0) {\n strategy.setMeasuredHeight(key, height);\n }\n }\n });\n });\n }\n\n /**\n * Observe an element's root nodes for height changes.\n */\n #observeViewElements(view: EmbeddedViewRef<VirtualForContext<T>>, key: unknown): void {\n if (!this.#resizeObserver) return;\n\n for (const node of view.rootNodes) {\n if (node instanceof HTMLElement) {\n const existingKey = this.#observedElements.get(node);\n if (Object.is(existingKey, key)) {\n continue;\n }\n if (existingKey !== undefined) {\n this.#resizeObserver.unobserve(node);\n }\n this.#observedElements.set(node, key);\n this.#resizeObserver.observe(node);\n }\n }\n }\n\n /**\n * Stop observing an element's root nodes.\n */\n #unobserveViewElements(view: EmbeddedViewRef<VirtualForContext<T>>): void {\n if (!this.#resizeObserver) return;\n\n for (const node of view.rootNodes) {\n if (node instanceof HTMLElement) {\n this.#observedElements.delete(node);\n this.#resizeObserver.unobserve(node);\n }\n }\n }\n\n /**\n * Update the rendered views with true view recycling.\n * Views are kept in the DOM and have their context updated in place when possible.\n */\n #updateViews(): void {\n const items = this.vdndVirtualForOf();\n const { start, end } = this.#renderRange();\n const strategy = this.#strategy();\n strategy.version();\n const placeholderIndex = this.#placeholderIndex();\n const showPlaceholder = this.#shouldShowPlaceholder();\n const draggedIndex = this.#draggedItemIndex();\n const droppableId = this.#effectiveDroppableId();\n const sourceDroppableId = this.#dragState.sourceDroppableId();\n const isSourceList = droppableId ? droppableId === sourceDroppableId : true;\n const shouldKeepDragged =\n this.#dragState.isDragging() &&\n draggedIndex >= 0 &&\n isSourceList &&\n draggedIndex < items.length;\n\n // Notify viewport of render start index for wrapper positioning\n this.#notifyViewportRenderStart(start);\n\n // 1. Build the list of items to render\n const itemsToRender = this.#calculateItemsToRender({\n items,\n start,\n end,\n showPlaceholder,\n placeholderIndex,\n shouldKeepDragged,\n draggedIndex,\n });\n\n // 2. Reconcile views with the DOM\n const placeholderDomPosition = this.#reconcileViews(itemsToRender, showPlaceholder, strategy);\n\n // 3. Position placeholder in DOM\n this.#positionPlaceholder(showPlaceholder, placeholderDomPosition, strategy, placeholderIndex);\n\n // 4. Trim view pool to prevent memory bloat\n this.#trimViewPool();\n }\n\n /**\n * Notify viewport of render start index for wrapper positioning.\n * With persistent excluded index, getOffsetForIndex already accounts for hidden items.\n */\n #notifyViewportRenderStart(start: number): void {\n if (!this.#useViewportPositioning) return;\n this.#viewport?.setRenderStartIndex(start);\n }\n\n /**\n * Calculate the list of items to render, including placeholder positioning\n * and keeping the dragged item alive when scrolled out of range.\n */\n #calculateItemsToRender(params: {\n items: T[];\n start: number;\n end: number;\n showPlaceholder: boolean;\n placeholderIndex: number;\n shouldKeepDragged: boolean;\n draggedIndex: number;\n }): RenderEntry<T>[] {\n const {\n items,\n start,\n end,\n showPlaceholder,\n placeholderIndex,\n shouldKeepDragged,\n draggedIndex,\n } = params;\n const trackByFn = this.vdndVirtualForTrackBy();\n const itemsToRender: RenderEntry<T>[] = [];\n\n // Build render list for visible range\n for (let i = start; i <= end && i < items.length; i++) {\n // Insert placeholder before item at placeholderIndex\n if (\n showPlaceholder &&\n placeholderIndex === i &&\n !itemsToRender.some((r) => r.type === 'placeholder')\n ) {\n itemsToRender.push({\n type: 'placeholder',\n key: '__placeholder__',\n context: null,\n visualIndex: placeholderIndex,\n });\n }\n\n const item = items[i];\n itemsToRender.push({\n type: 'item',\n key: trackByFn(i, item),\n context: {\n $implicit: item,\n index: i,\n first: i === start,\n last: i === end || i === items.length - 1,\n count: items.length,\n },\n visualIndex: i,\n });\n }\n\n // Add placeholder at end if needed\n if (\n showPlaceholder &&\n placeholderIndex >= items.length &&\n !itemsToRender.some((r) => r.type === 'placeholder')\n ) {\n itemsToRender.push({\n type: 'placeholder',\n key: '__placeholder__',\n context: null,\n visualIndex: placeholderIndex,\n });\n }\n\n // Keep dragged item view alive when scrolled out of range\n if (shouldKeepDragged && (draggedIndex < start || draggedIndex > end)) {\n const draggedItem = items[draggedIndex];\n const draggedKey = trackByFn(draggedIndex, draggedItem);\n const alreadyRendered = itemsToRender.some(\n (entry) => entry.type === 'item' && entry.key === draggedKey,\n );\n if (!alreadyRendered) {\n itemsToRender.push({\n type: 'item',\n key: draggedKey,\n context: {\n $implicit: draggedItem,\n index: draggedIndex,\n first: draggedIndex === 0,\n last: draggedIndex === items.length - 1,\n count: items.length,\n },\n visualIndex: draggedIndex,\n });\n }\n }\n\n return itemsToRender;\n }\n\n /**\n * Reconcile views with the calculated items to render.\n * Moves unused views to pool, updates existing views, creates new views as needed.\n * Returns the DOM position where placeholder should be inserted.\n */\n #reconcileViews(\n itemsToRender: RenderEntry<T>[],\n showPlaceholder: boolean,\n strategy: VirtualScrollStrategy,\n ): number {\n // Determine which keys we need\n const neededKeys = new Set(\n itemsToRender.filter((r) => r.type === 'item').map((item) => item.key),\n );\n\n // Move unused views to pool\n for (const [key, view] of this.#activeViews) {\n if (!neededKeys.has(key)) {\n const index = this.#viewContainer.indexOf(view);\n if (index >= 0) {\n this.#viewContainer.detach(index);\n }\n this.#unobserveViewElements(view);\n this.#viewPool.push(view);\n this.#activeViews.delete(key);\n }\n }\n\n // Remove placeholder from DOM if not needed\n if (!showPlaceholder && this.#placeholderInDom && this.#placeholder) {\n this.#placeholder.remove();\n this.#placeholderInDom = false;\n }\n\n // Process items and track placeholder position\n let viewContainerIndex = 0;\n let placeholderDomPosition = -1;\n const renderedKeys = new Set<unknown>();\n\n for (const entry of itemsToRender) {\n if (entry.type === 'placeholder') {\n placeholderDomPosition = viewContainerIndex;\n continue;\n }\n\n if (renderedKeys.has(entry.key)) {\n this.#warnDuplicateTrackByKey(entry.key);\n continue;\n }\n renderedKeys.add(entry.key);\n\n const view = this.#getOrCreateView(entry.key, entry.context!);\n\n // Ensure view is at correct position in ViewContainerRef\n const currentIndex = this.#viewContainer.indexOf(view);\n if (currentIndex !== viewContainerIndex) {\n const targetIndex = this.#getSafeViewContainerIndex(currentIndex, viewContainerIndex);\n if (currentIndex >= 0) {\n if (currentIndex !== targetIndex) {\n this.#viewContainer.move(view, targetIndex);\n }\n } else {\n this.#viewContainer.insert(view, targetIndex);\n }\n }\n\n // Apply absolute positioning when not using viewport wrapper\n if (!this.#useViewportPositioning) {\n const offset = strategy.getOffsetForIndex(entry.visualIndex);\n this.#applyAbsolutePositioning(view, offset);\n }\n\n // Observe for dynamic height measurement\n if (this.#resizeObserver) {\n this.#observeViewElements(view, entry.key);\n }\n\n viewContainerIndex++;\n }\n\n return placeholderDomPosition;\n }\n\n /**\n * Clamp target indices for move/insert to avoid out-of-range operations when\n * reconciliation is given invalid duplicate keys or transiently inconsistent view state.\n */\n #getSafeViewContainerIndex(currentIndex: number, requestedIndex: number): number {\n const length = this.#viewContainer.length;\n\n if (currentIndex >= 0) {\n if (length <= 1) return 0;\n return Math.min(requestedIndex, length - 1);\n }\n\n return Math.min(requestedIndex, length);\n }\n\n /**\n * Duplicate trackBy keys cannot be reconciled to distinct views.\n * Warn in dev mode and skip duplicates to prevent container corruption.\n */\n #warnDuplicateTrackByKey(key: unknown): void {\n if (isDevMode()) {\n console.warn(\n `[ngx-virtual-dnd] Duplicate trackBy key detected in vdndVirtualFor: ${String(key)}. ` +\n 'Skipping duplicate item to avoid view reconciliation errors.',\n );\n }\n }\n\n /**\n * Get an existing view or create/recycle one from the pool.\n */\n #getOrCreateView(\n key: unknown,\n context: VirtualForContext<T>,\n ): EmbeddedViewRef<VirtualForContext<T>> {\n let view = this.#activeViews.get(key);\n\n if (view) {\n // Update existing view context\n Object.assign(view.context, context);\n view.markForCheck();\n } else {\n // Try pool first, then create new\n view = this.#viewPool.pop();\n if (view) {\n Object.assign(view.context, context);\n view.markForCheck();\n } else {\n view = this.#templateRef.createEmbeddedView(context);\n }\n this.#activeViews.set(key, view);\n }\n\n return view;\n }\n\n /**\n * Apply absolute positioning styles to a view's root nodes.\n */\n #applyAbsolutePositioning(view: EmbeddedViewRef<VirtualForContext<T>>, topOffset: number): void {\n for (const node of view.rootNodes) {\n if (node instanceof HTMLElement) {\n node.style.position = 'absolute';\n node.style.top = `${topOffset}px`;\n node.style.left = '0';\n node.style.right = '0';\n }\n }\n }\n\n /**\n * Position the placeholder element in the DOM at the correct index.\n */\n #positionPlaceholder(\n showPlaceholder: boolean,\n placeholderDomPosition: number,\n strategy: VirtualScrollStrategy,\n placeholderIndex: number,\n ): void {\n if (!showPlaceholder || !this.#placeholder || placeholderDomPosition < 0) {\n return;\n }\n\n // Use the dragged item's height if available, otherwise use strategy height\n const draggedItemHeight = this.#dragState.draggedItem()?.height;\n const height = draggedItemHeight ?? strategy.getItemHeight(placeholderIndex);\n this.#placeholder.style.height = `${height}px`;\n\n const container = this.#viewContainer.element.nativeElement.parentElement;\n if (!container) return;\n\n // Find children excluding spacers and placeholder itself\n const children = Array.from(container.children).filter((el) => {\n const element = el as Element;\n return (\n !element.classList.contains('vdnd-drag-placeholder') &&\n !element.classList.contains('vdnd-virtual-for-spacer') &&\n !element.classList.contains('vdnd-content-spacer')\n );\n });\n const insertBeforeEl = children[placeholderDomPosition] ?? null;\n\n if (!this.#placeholderInDom) {\n // First insertion\n if (insertBeforeEl) {\n container.insertBefore(this.#placeholder, insertBeforeEl);\n } else {\n container.appendChild(this.#placeholder);\n }\n this.#placeholderInDom = true;\n } else {\n // Move to correct position if needed\n const currentNextSibling = this.#placeholder.nextElementSibling;\n if (insertBeforeEl !== currentNextSibling) {\n if (insertBeforeEl) {\n container.insertBefore(this.#placeholder, insertBeforeEl);\n } else {\n container.appendChild(this.#placeholder);\n }\n }\n }\n }\n\n /**\n * Trim the view pool to prevent memory bloat, keeping a reasonable buffer.\n */\n #trimViewPool(): void {\n const maxPoolSize = 10;\n while (this.#viewPool.length > maxPoolSize) {\n const view = this.#viewPool.pop();\n view?.destroy();\n }\n }\n\n /**\n * Static method for Angular's structural directive microsyntax.\n */\n static ngTemplateContextGuard<T>(\n _dir: VirtualForDirective<T>,\n _ctx: unknown,\n ): _ctx is VirtualForContext<T> {\n return true;\n }\n}\n","import { isDevMode, type WritableSignal } from '@angular/core';\nimport { DropEvent } from '../models/drag-drop.models';\n\n/**\n * Moves an item between signal-based lists based on a drop event.\n * Handles both same-list reordering and cross-list moves.\n *\n * @example\n * ```typescript\n * // In your component:\n * readonly list1 = signal<Item[]>([...]);\n * readonly list2 = signal<Item[]>([...]);\n *\n * onDrop(event: DropEvent): void {\n * moveItem(event, {\n * 'list-1': this.list1,\n * 'list-2': this.list2,\n * });\n * }\n * ```\n *\n * @param event The drop event from the droppable directive\n * @param lists A map of droppable IDs to their corresponding WritableSignal arrays\n */\nexport function moveItem<T>(event: DropEvent, lists: Record<string, WritableSignal<T[]>>): void {\n const sourceList = lists[event.source.droppableId];\n const destList = lists[event.destination.droppableId];\n\n if (!sourceList || !destList) {\n if (isDevMode()) {\n console.warn(\n `[ngx-virtual-dnd] [moveItem] Could not find list for droppable \"${event.source.droppableId}\" or \"${event.destination.droppableId}\"`,\n );\n }\n return;\n }\n\n const sourceIndex = event.source.index;\n const destIndex = event.destination.index;\n\n // Same list reorder\n if (event.source.droppableId === event.destination.droppableId) {\n reorderItems(event, sourceList);\n return;\n }\n\n // Cross-list move\n const sourceItems = sourceList();\n const item = sourceItems[sourceIndex];\n\n if (item === undefined) {\n if (isDevMode()) {\n console.warn(`[ngx-virtual-dnd] [moveItem] Could not find item at index ${sourceIndex}`);\n }\n return;\n }\n\n // Remove from source\n sourceList.update((items) => {\n const newItems = [...items];\n newItems.splice(sourceIndex, 1);\n return newItems;\n });\n\n // Insert at destination\n destList.update((items) => {\n const newItems = [...items];\n newItems.splice(destIndex, 0, item);\n return newItems;\n });\n}\n\n/**\n * Reorders items within a single signal-based list.\n *\n * @example\n * ```typescript\n * readonly items = signal<Item[]>([...]);\n *\n * onDrop(event: DropEvent): void {\n * reorderItems(event, this.items);\n * }\n * ```\n *\n * @param event The drop event from the droppable directive\n * @param list The WritableSignal array to reorder\n */\nexport function reorderItems<T>(event: DropEvent, list: WritableSignal<T[]>): void {\n const sourceIndex = event.source.index;\n const destIndex = event.destination.index;\n\n // No-op if same position\n if (sourceIndex === destIndex) {\n return;\n }\n\n list.update((items) => {\n const newItems = [...items];\n const [removed] = newItems.splice(sourceIndex, 1);\n\n // Note: destination.index from DropEvent is already adjusted for same-list\n // reordering by DroppableDirective.#handleDrop(), so we use it directly.\n newItems.splice(destIndex, 0, removed);\n return newItems;\n });\n}\n\n/**\n * Applies a move operation immutably, returning new array objects.\n * Useful for state management patterns that require immutable updates.\n *\n * @example\n * ```typescript\n * onDrop(event: DropEvent): void {\n * const { list1, list2 } = applyMove(event, {\n * 'list-1': this.list1,\n * 'list-2': this.list2,\n * });\n * // Use the returned arrays with your state management\n * }\n * ```\n *\n * @param event The drop event from the droppable directive\n * @param lists A map of droppable IDs to their corresponding arrays\n * @returns A new object with the same keys but updated arrays\n */\nexport function applyMove<T>(event: DropEvent, lists: Record<string, T[]>): Record<string, T[]> {\n const result = { ...lists };\n const sourceKey = event.source.droppableId;\n const destKey = event.destination.droppableId;\n const sourceIndex = event.source.index;\n const destIndex = event.destination.index;\n\n const sourceItems = [...(lists[sourceKey] ?? [])];\n const item = sourceItems[sourceIndex];\n\n if (item === undefined) {\n return result;\n }\n\n // Same list reorder\n // Note: destination.index from DropEvent is already adjusted for same-list\n // reordering by DroppableDirective.#handleDrop(), so we use it directly.\n if (sourceKey === destKey) {\n const [removed] = sourceItems.splice(sourceIndex, 1);\n sourceItems.splice(destIndex, 0, removed);\n result[sourceKey] = sourceItems;\n return result;\n }\n\n // Cross-list move\n const destItems = [...(lists[destKey] ?? [])];\n sourceItems.splice(sourceIndex, 1);\n destItems.splice(destIndex, 0, item);\n\n result[sourceKey] = sourceItems;\n result[destKey] = destItems;\n\n return result;\n}\n\n/**\n * Checks if a drop event represents a no-op (item dropped in its original position).\n * Useful for skipping unnecessary state updates.\n *\n * @example\n * ```typescript\n * onDrop(event: DropEvent): void {\n * if (isNoOpDrop(event)) {\n * return; // No action needed\n * }\n * moveItem(event, this.lists);\n * }\n * ```\n *\n * @param event The drop event to check\n * @returns true if the drop would result in no change\n */\nexport function isNoOpDrop(event: DropEvent): boolean {\n return (\n event.source.droppableId === event.destination.droppableId &&\n event.source.index === event.destination.index\n );\n}\n\n/**\n * Creates a new list with the item inserted at the specified index.\n * Low-level utility for custom implementations.\n *\n * @param list The source array\n * @param item The item to insert\n * @param index The index to insert at\n * @returns A new array with the item inserted\n */\nexport function insertAt<T>(list: T[], item: T, index: number): T[] {\n const result = [...list];\n result.splice(index, 0, item);\n return result;\n}\n\n/**\n * Creates a new list with the item at the specified index removed.\n * Low-level utility for custom implementations.\n *\n * @param list The source array\n * @param index The index to remove\n * @returns A new array with the item removed\n */\nexport function removeAt<T>(list: T[], index: number): T[] {\n const result = [...list];\n result.splice(index, 1);\n return result;\n}\n","// Models\nexport * from './models/drag-drop.models';\nexport type { VirtualScrollStrategy } from './models/virtual-scroll-strategy';\n\n// Strategies\nexport { FixedHeightStrategy } from './strategies/fixed-height.strategy';\nexport { DynamicHeightStrategy } from './strategies/dynamic-height.strategy';\n\n// Tokens\nexport { VDND_SCROLL_CONTAINER } from './tokens/scroll-container.token';\nexport type { VdndScrollContainer } from './tokens/scroll-container.token';\nexport { VDND_VIRTUAL_VIEWPORT } from './tokens/virtual-viewport.token';\nexport type { VdndVirtualViewport } from './tokens/virtual-viewport.token';\n\n// Services\nexport { DragStateService } from './services/drag-state.service';\nexport { PositionCalculatorService } from './services/position-calculator.service';\nexport { AutoScrollService } from './services/auto-scroll.service';\nexport type { AutoScrollConfig } from './services/auto-scroll.service';\nexport { ElementCloneService } from './services/element-clone.service';\nexport { KeyboardDragService } from './services/keyboard-drag.service';\nexport { OverlayContainerService } from './services/overlay-container.service';\n\n// Components\nexport { VirtualScrollContainerComponent } from './components/virtual-scroll-container.component';\nexport type { VirtualScrollItemContext } from './components/virtual-scroll-container.component';\nexport { DragPreviewComponent } from './components/drag-preview.component';\nexport type { DragPreviewContext } from './components/drag-preview.component';\nexport { PlaceholderComponent } from './components/placeholder.component';\nexport type { PlaceholderContext } from './components/placeholder.component';\nexport { DragPlaceholderComponent } from './components/drag-placeholder.component';\nexport { VirtualSortableListComponent } from './components/virtual-sortable-list.component';\nexport { VirtualViewportComponent } from './components/virtual-viewport.component';\nexport { VirtualContentComponent } from './components/virtual-content.component';\n\n// Directives\nexport { DraggableDirective } from './directives/draggable.directive';\nexport { DroppableDirective } from './directives/droppable.directive';\nexport { DroppableGroupDirective, VDND_GROUP_TOKEN } from './directives/droppable-group.directive';\nexport type { VdndGroupContext } from './directives/droppable-group.directive';\nexport { ScrollableDirective } from './directives/scrollable.directive';\nexport { VirtualForDirective } from './directives/virtual-for.directive';\nexport type { VirtualForContext } from './directives/virtual-for.directive';\nexport { ContentHeaderDirective } from './directives/content-header.directive';\n\n// Utilities\nexport {\n moveItem,\n reorderItems,\n applyMove,\n isNoOpDrop,\n insertAt,\n removeAt,\n} from './utils/drop-helpers';\n","/*\n * Public API Surface of ngx-virtual-dnd\n */\n\nexport * from './lib/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-virtual-dnd.mjs","sources":["../../../projects/ngx-virtual-dnd/src/lib/models/drag-drop.models.ts","../../../projects/ngx-virtual-dnd/src/lib/strategies/fixed-height.strategy.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/height-cache.ts","../../../projects/ngx-virtual-dnd/src/lib/strategies/dynamic-height.strategy.ts","../../../projects/ngx-virtual-dnd/src/lib/tokens/scroll-container.token.ts","../../../projects/ngx-virtual-dnd/src/lib/tokens/virtual-viewport.token.ts","../../../projects/ngx-virtual-dnd/src/lib/services/drag-state.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/position-calculator.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/auto-scroll.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/element-clone.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/keyboard-drag.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/overlay-container.service.ts","../../../projects/ngx-virtual-dnd/src/lib/services/drag-index-calculator.service.ts","../../../projects/ngx-virtual-dnd/src/lib/components/drag-placeholder.component.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/dom-signal-bindings.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-scroll-container.component.ts","../../../projects/ngx-virtual-dnd/src/lib/components/drag-preview.component.ts","../../../projects/ngx-virtual-dnd/src/lib/components/placeholder.component.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/droppable-group.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/group-resolution.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/droppable.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-sortable-list.component.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-viewport.component.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/content-header.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/components/virtual-content.component.ts","../../../projects/ngx-virtual-dnd/src/lib/handlers/keyboard-drag.handler.ts","../../../projects/ngx-virtual-dnd/src/lib/handlers/pointer-drag.handler.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/draggable.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/scrollable.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/directives/virtual-for.directive.ts","../../../projects/ngx-virtual-dnd/src/lib/utils/drop-helpers.ts","../../../projects/ngx-virtual-dnd/src/lib/index.ts","../../../projects/ngx-virtual-dnd/src/public-api.ts","../../../projects/ngx-virtual-dnd/src/ngx-virtual-dnd.ts"],"sourcesContent":["/**\n * Represents the item currently being dragged.\n */\nexport interface DraggedItem {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Reference to the dragged element */\n element: HTMLElement;\n /** Cloned element for use in drag preview (auto-generated) */\n clonedElement?: HTMLElement;\n /** Height of the dragged element in pixels */\n height: number;\n /** Width of the dragged element in pixels */\n width: number;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n}\n\n/**\n * Current position of the cursor during drag.\n */\nexport interface CursorPosition {\n x: number;\n y: number;\n}\n\n/**\n * Offset from cursor to the top-left corner of the dragged element.\n * Used to maintain grab position during drag.\n */\nexport interface GrabOffset {\n x: number;\n y: number;\n}\n\n/**\n * Complete state of the drag-and-drop system.\n */\nexport interface DragState {\n /** Whether a drag operation is currently in progress */\n isDragging: boolean;\n /** Information about the item being dragged */\n draggedItem: DraggedItem | null;\n /** ID of the droppable where the drag started */\n sourceDroppableId: string | null;\n /** Original index of the dragged item in the source list */\n sourceIndex: number | null;\n /** ID of the droppable currently being hovered over */\n activeDroppableId: string | null;\n /** ID of the item the placeholder should appear before, or 'END_OF_LIST' */\n placeholderId: string | null;\n /** Index where the placeholder should be inserted (more stable than placeholderId) */\n placeholderIndex: number | null;\n /** Current cursor position */\n cursorPosition: CursorPosition | null;\n /** Offset from cursor to element top-left (for maintaining grab position) */\n grabOffset: GrabOffset | null;\n /** Position when drag started (for axis locking) */\n initialPosition: CursorPosition | null;\n /** Axis to lock movement to ('x' = horizontal only, 'y' = vertical only) */\n lockAxis: 'x' | 'y' | null;\n /** Whether this is a keyboard-initiated drag */\n isKeyboardDrag: boolean;\n /** Target index during keyboard navigation */\n keyboardTargetIndex: number | null;\n}\n\n/**\n * Event emitted when a drag operation starts.\n */\nexport interface DragStartEvent {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n /** Position where the drag started */\n position: CursorPosition;\n /** 0-indexed position in the source list (for screen reader announcements) */\n sourceIndex: number;\n}\n\n/**\n * Source information for a drop event.\n */\nexport interface DropSource {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Original index in the source list */\n index: number;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n}\n\n/**\n * Destination information for a drop event.\n */\nexport interface DropDestination {\n /** ID of the droppable container receiving the item */\n droppableId: string;\n /** ID of the item to insert before, or 'END_OF_LIST' */\n placeholderId: string;\n /** Target index in the destination list */\n index: number;\n /** Optional user-provided data associated with the droppable */\n data?: unknown;\n}\n\n/**\n * Event emitted when an item is dropped.\n */\nexport interface DropEvent {\n /** Information about where the item came from */\n source: DropSource;\n /** Information about where the item is going */\n destination: DropDestination;\n}\n\n/**\n * Event emitted when a drag operation ends (including cancel).\n */\nexport interface DragEndEvent {\n /** Unique identifier for the draggable item */\n draggableId: string;\n /** ID of the droppable container the item originated from */\n droppableId: string;\n /** Whether the drag was cancelled (escaped, dropped outside) */\n cancelled: boolean;\n /** Optional user-provided data associated with the item */\n data?: unknown;\n /** Original 0-indexed position in source list (for cancel announcements) */\n sourceIndex: number;\n /** Final 0-indexed position (null if cancelled) */\n destinationIndex: number | null;\n}\n\n/**\n * Initial state for the drag state service.\n */\nexport const INITIAL_DRAG_STATE: DragState = {\n isDragging: false,\n draggedItem: null,\n sourceDroppableId: null,\n sourceIndex: null,\n activeDroppableId: null,\n placeholderId: null,\n placeholderIndex: null,\n cursorPosition: null,\n grabOffset: null,\n initialPosition: null,\n lockAxis: null,\n isKeyboardDrag: false,\n keyboardTargetIndex: null,\n};\n\n/**\n * Placeholder ID used when dropping at the end of a list.\n */\nexport const END_OF_LIST = 'END_OF_LIST';\n","import { signal } from '@angular/core';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\n\n/**\n * Fixed-height virtual scroll strategy.\n *\n * Wraps the existing `index * itemHeight` math with zero overhead — no cache,\n * no measurement. This is the default strategy used when `dynamicItemHeight`\n * is not enabled.\n */\nexport class FixedHeightStrategy implements VirtualScrollStrategy {\n readonly #itemHeight: number;\n\n /** Excluded index during same-list drag (-1 = none) */\n #excludedIndex = -1;\n\n /** Logical item count from setItemKeys (used by drag index calculator) */\n #itemCount = 0;\n\n /** Version signal — bumps when exclusion changes */\n readonly #version = signal(0);\n readonly version = this.#version.asReadonly();\n\n constructor(itemHeight: number) {\n this.#itemHeight = itemHeight;\n }\n\n getTotalHeight(itemCount: number): number {\n return itemCount * this.#itemHeight;\n }\n\n getFirstVisibleIndex(scrollTop: number): number {\n if (this.#itemHeight <= 0) return 0;\n return Math.floor(scrollTop / this.#itemHeight);\n }\n\n getVisibleCount(_startIndex: number, containerHeight: number): number {\n if (containerHeight <= 0 || this.#itemHeight <= 0) return 0;\n return Math.ceil(containerHeight / this.#itemHeight);\n }\n\n getOffsetForIndex(index: number): number {\n if (this.#excludedIndex >= 0 && index > this.#excludedIndex) {\n return (index - 1) * this.#itemHeight;\n }\n return index * this.#itemHeight;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getItemHeight(index: number): number {\n return this.#itemHeight;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setMeasuredHeight(key: unknown, height: number): void {\n // No-op for fixed height strategy\n }\n\n setItemKeys(keys: unknown[]): void {\n const prevCount = this.#itemCount;\n this.#itemCount = keys.length;\n if (prevCount !== this.#itemCount) {\n this.#version.update((v) => v + 1);\n }\n }\n\n setExcludedIndex(index: number | null): void {\n const newIndex = index ?? -1;\n if (this.#excludedIndex !== newIndex) {\n this.#excludedIndex = newIndex;\n this.#version.update((v) => v + 1);\n }\n }\n\n findIndexAtOffset(offset: number): number {\n if (this.#itemHeight <= 0) return 0;\n const visualIndex = Math.floor(offset / this.#itemHeight);\n // When an item is excluded (same-list drag), visual indices at or past\n // the excluded position map to logical index + 1\n if (this.#excludedIndex >= 0 && visualIndex >= this.#excludedIndex) {\n return visualIndex + 1;\n }\n return visualIndex;\n }\n\n getItemCount(): number {\n return this.#itemCount;\n }\n}\n","/**\n * Cache for measured item heights in dynamic virtual scrolling.\n *\n * Tracks heights by trackBy key (survives reordering). Maintains a cumulative\n * offset prefix-sum array, lazily rebuilt on height change. Binary search\n * O(log N) for scroll-to-index lookups.\n *\n * This is a plain class (not a service) — one instance per virtual scroll.\n */\nexport class HeightCache {\n /** Estimated height used for unmeasured items */\n readonly #estimatedHeight: number;\n\n /** Map from trackBy key to measured height */\n readonly #heightsByKey = new Map<unknown, number>();\n\n /** Current ordered list of trackBy keys (index-aligned with item array) */\n #keys: unknown[] = [];\n\n /** Prefix sums: offsets[i] = cumulative height of items 0..i-1 */\n #offsets: number[] = [];\n\n /** Whether offsets need to be rebuilt */\n #dirty = true;\n\n /** Index excluded during same-list drag (-1 = none) */\n #excludedIndex = -1;\n\n constructor(estimatedHeight: number) {\n this.#estimatedHeight = estimatedHeight;\n }\n\n /** Number of measured items */\n get measuredCount(): number {\n return this.#heightsByKey.size;\n }\n\n /** Number of logical items in the cache */\n get itemCount(): number {\n return this.#keys.length;\n }\n\n /**\n * Update the ordered list of trackBy keys.\n * This must be called whenever items change order or the array changes.\n */\n setKeys(keys: unknown[]): boolean {\n const sameOrder =\n keys.length === this.#keys.length &&\n keys.every((key, index) => Object.is(key, this.#keys[index]));\n\n const nextKeySet = new Set(keys);\n let pruned = false;\n for (const key of this.#heightsByKey.keys()) {\n if (!nextKeySet.has(key)) {\n this.#heightsByKey.delete(key);\n pruned = true;\n }\n }\n\n if (sameOrder && !pruned) {\n return false;\n }\n\n this.#keys = keys;\n this.#dirty = true;\n return true;\n }\n\n /**\n * Record a measured height for a trackBy key.\n * @returns true if the height actually changed (triggers version bump)\n */\n setHeight(key: unknown, height: number): boolean {\n const existing = this.#heightsByKey.get(key);\n if (existing === height) return false;\n this.#heightsByKey.set(key, height);\n this.#dirty = true;\n return true;\n }\n\n /**\n * Get the height for a specific index.\n * Returns measured height if available, otherwise the estimated height.\n */\n getHeight(index: number): number {\n if (index < 0 || index >= this.#keys.length) return this.#estimatedHeight;\n const key = this.#keys[index];\n return this.#heightsByKey.get(key) ?? this.#estimatedHeight;\n }\n\n /**\n * Get the pixel offset (top position) for a given item index.\n * Accounts for the excluded index during same-list drag.\n */\n getOffset(index: number): number {\n this.#rebuildIfDirty();\n\n if (this.#excludedIndex < 0) {\n // No exclusion — direct lookup\n return index < this.#offsets.length ? this.#offsets[index] : this.#getTotalHeightRaw();\n }\n\n // With exclusion: subtract the excluded item's height from offsets\n // at or after the excluded index\n if (index <= this.#excludedIndex) {\n return this.#offsets[index] ?? 0;\n }\n\n // index > excludedIndex: offset = raw offset for (index) minus excluded item's height\n const rawOffset =\n index < this.#offsets.length ? this.#offsets[index] : this.#getTotalHeightRaw();\n const excludedHeight = this.getHeight(this.#excludedIndex);\n return rawOffset - excludedHeight;\n }\n\n /**\n * Get total content height for all items.\n * Does NOT exclude the dragged item — the spacer must maintain full height\n * during same-list drag so sibling content (footers etc.) doesn't shift.\n * Uses O(1) prefix-sum lookup when possible.\n */\n getTotalHeight(itemCount: number): number {\n this.#rebuildIfDirty();\n\n if (itemCount <= 0) return 0;\n\n const keyCount = this.#keys.length;\n if (keyCount === 0) return itemCount * this.#estimatedHeight;\n\n if (itemCount >= keyCount) {\n // All known items + estimated for any extras\n return this.#getTotalHeightRaw() + (itemCount - keyCount) * this.#estimatedHeight;\n }\n\n // Partial: prefix sum up to itemCount\n return this.#offsets[itemCount - 1] + this.getHeight(itemCount - 1);\n }\n\n /**\n * Find the first visible index for a given scrollTop.\n * Uses binary search on the prefix-sum offsets (excluding the excluded item).\n */\n findFirstVisibleIndex(scrollTop: number): number {\n this.#rebuildIfDirty();\n\n const count = this.#keys.length;\n if (count === 0) return 0;\n\n // Binary search for the first item whose bottom edge is past scrollTop\n let lo = 0;\n let hi = count - 1;\n let result = 0;\n\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const offset = this.getOffset(mid);\n if (offset <= scrollTop) {\n result = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Count visible items from startIndex within containerHeight.\n */\n getVisibleCount(startIndex: number, containerHeight: number): number {\n if (containerHeight <= 0) return 0;\n\n const count = this.#keys.length;\n let accumulated = 0;\n let visible = 0;\n let stopIndex = count;\n\n for (let i = startIndex; i < count; i++) {\n if (i === this.#excludedIndex) continue;\n accumulated += this.getHeight(i);\n visible++;\n if (accumulated >= containerHeight) {\n stopIndex = i;\n break;\n }\n }\n\n // Add 1 for partially visible items\n if (visible === 0) return 0;\n const hasMoreItems = stopIndex < count - 1;\n return hasMoreItems ? visible + 1 : visible;\n }\n\n /**\n * Find the item index at a given pixel offset.\n * Used for drag index calculations with variable heights.\n */\n findIndexAtOffset(offset: number): number {\n this.#rebuildIfDirty();\n\n const count = this.#keys.length;\n if (count === 0) return 0;\n\n if (!Number.isFinite(offset)) {\n return offset < 0 ? 0 : count;\n }\n\n if (offset <= 0) {\n if (this.#excludedIndex === 0) {\n return count > 1 ? 1 : count;\n }\n return 0;\n }\n\n const excludedIndex = this.#excludedIndex;\n if (excludedIndex < 0 || excludedIndex >= count) {\n return this.#findFirstIndexWithBottomPastOffset(offset, 0, count - 1);\n }\n\n const excludedOffset = this.#offsets[excludedIndex];\n if (offset < excludedOffset && excludedIndex > 0) {\n return this.#findFirstIndexWithBottomPastOffset(offset, 0, excludedIndex - 1);\n }\n\n if (excludedIndex >= count - 1) {\n return count;\n }\n\n const excludedHeight = this.getHeight(excludedIndex);\n return this.#findFirstIndexWithBottomPastOffset(\n offset + excludedHeight,\n excludedIndex + 1,\n count - 1,\n );\n }\n\n /**\n * Set the excluded index for same-list drag.\n */\n setExcludedIndex(index: number | null): boolean {\n const nextIndex = index ?? -1;\n if (this.#excludedIndex === nextIndex) {\n return false;\n }\n\n this.#excludedIndex = nextIndex;\n return true;\n }\n\n /**\n * Find first logical index in [start, end] whose bottom edge is past offset.\n * Returns one-past-end when no match is found.\n */\n #findFirstIndexWithBottomPastOffset(offset: number, start: number, end: number): number {\n if (start > end) {\n return start;\n }\n\n let lo = start;\n let hi = end;\n let result = end + 1;\n\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const midBottom = this.#offsets[mid] + this.getHeight(mid);\n\n if (midBottom > offset) {\n result = mid;\n hi = mid - 1;\n } else {\n lo = mid + 1;\n }\n }\n\n return result;\n }\n\n /** Raw total height without exclusion */\n #getTotalHeightRaw(): number {\n this.#rebuildIfDirty();\n const len = this.#offsets.length;\n if (len === 0) return 0;\n return this.#offsets[len - 1] + this.getHeight(len - 1);\n }\n\n /** Rebuild prefix-sum array if dirty */\n #rebuildIfDirty(): void {\n if (!this.#dirty) return;\n this.#dirty = false;\n\n const count = this.#keys.length;\n if (this.#offsets.length !== count) {\n this.#offsets = new Array<number>(count);\n }\n\n let cumulative = 0;\n for (let i = 0; i < count; i++) {\n this.#offsets[i] = cumulative;\n cumulative += this.getHeight(i);\n }\n }\n}\n","import { signal, type Signal, type WritableSignal } from '@angular/core';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { HeightCache } from '../utils/height-cache';\n\n/**\n * Dynamic-height virtual scroll strategy.\n *\n * Uses a `HeightCache` with prefix-sum offsets and binary search for O(log N)\n * scroll-to-index lookups. Heights are tracked by trackBy key (survive\n * reordering) and auto-measured via ResizeObserver by the directive.\n *\n * The `version` signal bumps whenever heights change, causing dependent\n * computeds to re-evaluate.\n */\nexport class DynamicHeightStrategy implements VirtualScrollStrategy {\n readonly #cache: HeightCache;\n readonly #version: WritableSignal<number> = signal(0);\n\n readonly version: Signal<number> = this.#version.asReadonly();\n\n constructor(estimatedHeight: number) {\n this.#cache = new HeightCache(estimatedHeight);\n }\n\n getTotalHeight(itemCount: number): number {\n // Read version to subscribe to changes\n this.#version();\n return this.#cache.getTotalHeight(itemCount);\n }\n\n getFirstVisibleIndex(scrollTop: number): number {\n this.#version();\n return this.#cache.findFirstVisibleIndex(scrollTop);\n }\n\n getVisibleCount(startIndex: number, containerHeight: number): number {\n this.#version();\n return this.#cache.getVisibleCount(startIndex, containerHeight);\n }\n\n getOffsetForIndex(index: number): number {\n this.#version();\n return this.#cache.getOffset(index);\n }\n\n getItemHeight(index: number): number {\n this.#version();\n return this.#cache.getHeight(index);\n }\n\n setMeasuredHeight(key: unknown, height: number): void {\n const changed = this.#cache.setHeight(key, height);\n if (changed) {\n this.#version.update((v) => v + 1);\n }\n }\n\n setItemKeys(keys: unknown[]): void {\n const changed = this.#cache.setKeys(keys);\n if (changed) {\n this.#version.update((v) => v + 1);\n }\n }\n\n setExcludedIndex(index: number | null): void {\n const changed = this.#cache.setExcludedIndex(index);\n if (changed) {\n this.#version.update((v) => v + 1);\n }\n }\n\n findIndexAtOffset(offset: number): number {\n this.#version();\n return this.#cache.findIndexAtOffset(offset);\n }\n\n getItemCount(): number {\n this.#version();\n return this.#cache.itemCount;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Interface for a scroll container that can be used with VirtualForDirective.\n * Implement this interface to create custom scroll containers.\n *\n * The scrollTop() and containerHeight() methods should return reactive values\n * (internally backed by signals) so that changes trigger re-computation in\n * the virtual scroll directive.\n */\nexport interface VdndScrollContainer {\n /** The native HTML element that handles scrolling */\n readonly nativeElement: HTMLElement;\n\n /** Current scroll position from top in pixels (reactive) */\n scrollTop(): number;\n\n /** Current container height in pixels (reactive) */\n containerHeight(): number;\n\n /** Scroll to a specific position */\n scrollTo(options: ScrollToOptions): void;\n}\n\n/**\n * Injection token for providing a scroll container to VirtualForDirective.\n *\n * Use the `vdndScrollable` directive to provide this token, or implement\n * `VdndScrollContainer` and provide it manually.\n *\n * @example\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </div>\n * ```\n */\nexport const VDND_SCROLL_CONTAINER = new InjectionToken<VdndScrollContainer>(\n 'VDND_SCROLL_CONTAINER'\n);\n","import { InjectionToken } from '@angular/core';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\n\n/**\n * Interface for a virtual viewport that provides wrapper-based positioning.\n * Components implementing this interface provide a content wrapper with\n * GPU-accelerated transform positioning for efficient virtual scrolling.\n */\nexport interface VdndVirtualViewport {\n /** Current scroll position */\n scrollTop(): number;\n\n /** Height of the viewport container */\n containerHeight(): number;\n\n /** Height of each item in pixels */\n itemHeight(): number;\n\n /** Offset for content below headers (page-level scroll scenarios) */\n contentOffset(): number;\n\n /** The native element of the viewport */\n readonly nativeElement: HTMLElement;\n\n /**\n * Called by VirtualForDirective to inform the viewport of the actual\n * first rendered item index (accounting for overscan). The viewport\n * uses this to position the content wrapper correctly.\n */\n setRenderStartIndex(index: number): void;\n\n /**\n * Get the pixel offset for a given item index.\n * Uses the strategy pattern to support both fixed and dynamic heights.\n */\n getOffsetForIndex(index: number): number;\n\n /**\n * The virtual scroll strategy used by this viewport.\n * Available for drag-drop integration and external consumers.\n */\n readonly strategy: VirtualScrollStrategy | null;\n}\n\n/**\n * Injection token for virtual viewport.\n * VirtualForDirective optionally injects this to detect if it's inside\n * a viewport component that handles wrapper-based positioning.\n */\nexport const VDND_VIRTUAL_VIEWPORT = new InjectionToken<VdndVirtualViewport>(\n 'VDND_VIRTUAL_VIEWPORT',\n);\n","import { computed, effect, Injectable, signal } from '@angular/core';\nimport { CursorPosition, DraggedItem, DragState, GrabOffset } from '../models/drag-drop.models';\n\n/**\n * Internal state type without high-frequency fields.\n * `cursorPosition` and `keyboardTargetIndex` are split into dedicated signals\n * so that 60fps cursor updates don't trigger re-evaluation of rarely-changing computeds.\n */\ntype CoreDragState = Omit<DragState, 'cursorPosition' | 'keyboardTargetIndex'>;\n\nconst INITIAL_CORE_STATE: CoreDragState = {\n isDragging: false,\n draggedItem: null,\n sourceDroppableId: null,\n sourceIndex: null,\n activeDroppableId: null,\n placeholderId: null,\n placeholderIndex: null,\n grabOffset: null,\n initialPosition: null,\n lockAxis: null,\n isKeyboardDrag: false,\n};\n\n/**\n * Central service for managing drag-and-drop state.\n * Uses signals for reactive state management.\n *\n * Architecture: High-frequency fields (`cursorPosition`, `keyboardTargetIndex`)\n * are stored in dedicated signals, separate from the core state. This prevents\n * 60fps cursor updates from triggering re-evaluation of the 10+ computeds\n * that only depend on rarely-changing properties (isDragging, draggedItem, etc.).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DragStateService {\n /** Core state signal — contains all rarely-changing properties */\n readonly #state = signal<CoreDragState>(INITIAL_CORE_STATE);\n\n /** High-frequency cursor position — updated at 60fps during pointer drag */\n readonly #cursorPosition = signal<CursorPosition | null>(null);\n\n /** High-frequency keyboard target index — updated on each arrow key press */\n readonly #keyboardTargetIndex = signal<number | null>(null);\n\n /** Flag indicating if the last drag was cancelled (not dropped) */\n readonly #wasCancelled = signal<boolean>(false);\n\n /** Whether the last drag was cancelled (for droppable to check before emitting drop) */\n readonly wasCancelled = this.#wasCancelled.asReadonly();\n\n /** Whether a drag operation is in progress */\n readonly isDragging = computed(() => this.#state().isDragging);\n\n /** The currently dragged item, or null */\n readonly draggedItem = computed(() => this.#state().draggedItem);\n\n /** ID of the currently dragged item, or null (convenience signal for filtering) */\n readonly draggedItemId = computed(() => this.#state().draggedItem?.draggableId ?? null);\n\n /** ID of the droppable where the drag started */\n readonly sourceDroppableId = computed(() => this.#state().sourceDroppableId);\n\n /** Original index of the dragged item in the source list */\n readonly sourceIndex = computed(() => this.#state().sourceIndex);\n\n /** ID of the droppable currently being hovered over */\n readonly activeDroppableId = computed(() => this.#state().activeDroppableId);\n\n /** ID of the item the placeholder should appear before */\n readonly placeholderId = computed(() => this.#state().placeholderId);\n\n /** Index where the placeholder should be inserted */\n readonly placeholderIndex = computed(() => this.#state().placeholderIndex);\n\n /** Current cursor position */\n readonly cursorPosition = this.#cursorPosition.asReadonly();\n\n /** Offset from cursor to element top-left (for maintaining grab position) */\n readonly grabOffset = computed(() => this.#state().grabOffset);\n\n /** Position when drag started (for axis locking) */\n readonly initialPosition = computed(() => this.#state().initialPosition);\n\n /** Axis to lock movement to */\n readonly lockAxis = computed(() => this.#state().lockAxis);\n\n /** Whether this is a keyboard-initiated drag */\n readonly isKeyboardDrag = computed(() => this.#state().isKeyboardDrag);\n\n /** Target index during keyboard navigation */\n readonly keyboardTargetIndex = this.#keyboardTargetIndex.asReadonly();\n\n constructor() {\n // Inject cursor styles once (for consistent grabbing cursor during drag)\n if (typeof document !== 'undefined') {\n const styleId = 'vdnd-cursor-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n body.vdnd-dragging,\n body.vdnd-dragging * {\n cursor: grabbing !important;\n }\n `;\n document.head.appendChild(style);\n }\n }\n\n // Effect to toggle body class during drag\n effect(() => {\n if (typeof document === 'undefined') return;\n const isDragging = this.isDragging();\n document.body.classList.toggle('vdnd-dragging', isDragging);\n });\n }\n\n /**\n * Start a drag operation.\n */\n startDrag(\n item: DraggedItem,\n cursorPosition?: CursorPosition,\n grabOffset?: GrabOffset,\n lockAxis?: 'x' | 'y' | null,\n activeDroppableId?: string | null,\n placeholderId?: string | null,\n placeholderIndex?: number | null,\n sourceIndex?: number | null,\n isKeyboardDrag?: boolean,\n axisLockPosition?: CursorPosition,\n ): void {\n // Reset cancellation flag at start of new drag\n this.#wasCancelled.set(false);\n this.#cursorPosition.set(cursorPosition ?? null);\n this.#keyboardTargetIndex.set(isKeyboardDrag ? (sourceIndex ?? 0) : null);\n this.#state.set({\n isDragging: true,\n draggedItem: item,\n sourceDroppableId: item.droppableId,\n sourceIndex: sourceIndex ?? null,\n activeDroppableId: activeDroppableId ?? null,\n placeholderId: placeholderId ?? null,\n placeholderIndex: placeholderIndex ?? null,\n grabOffset: grabOffset ?? null,\n initialPosition: axisLockPosition ?? cursorPosition ?? null,\n lockAxis: lockAxis ?? null,\n isKeyboardDrag: isKeyboardDrag ?? false,\n });\n }\n\n /**\n * Update the drag position and targets.\n */\n updateDragPosition(update: {\n cursorPosition: CursorPosition;\n activeDroppableId: string | null;\n placeholderId: string | null;\n placeholderIndex: number | null;\n }): void {\n if (!this.#state().isDragging) {\n return;\n }\n\n // Write cursor to dedicated high-frequency signal\n this.#cursorPosition.set(update.cursorPosition);\n\n // Only update core state if droppable/placeholder actually changed\n const current = this.#state();\n if (\n current.activeDroppableId !== update.activeDroppableId ||\n current.placeholderId !== update.placeholderId ||\n current.placeholderIndex !== update.placeholderIndex\n ) {\n this.#state.update((state) => ({\n ...state,\n activeDroppableId: update.activeDroppableId,\n placeholderId: update.placeholderId,\n placeholderIndex: update.placeholderIndex,\n }));\n }\n }\n\n /**\n * Update just the active droppable.\n */\n setActiveDroppable(droppableId: string | null): void {\n if (!this.#state().isDragging) {\n return;\n }\n\n this.#state.update((state) => ({\n ...state,\n activeDroppableId: droppableId,\n }));\n }\n\n /**\n * Update just the placeholder position.\n */\n setPlaceholder(placeholderId: string | null): void {\n if (!this.#state().isDragging) {\n return;\n }\n\n this.#state.update((state) => ({\n ...state,\n placeholderId,\n }));\n }\n\n /**\n * End the drag operation and reset state (normal drop).\n */\n endDrag(): void {\n this.#wasCancelled.set(false);\n this.#cursorPosition.set(null);\n this.#keyboardTargetIndex.set(null);\n this.#state.set(INITIAL_CORE_STATE);\n }\n\n /**\n * Cancel the drag operation (escape key, disabled, etc.).\n */\n cancelDrag(): void {\n this.#wasCancelled.set(true);\n this.#cursorPosition.set(null);\n this.#keyboardTargetIndex.set(null);\n this.#state.set(INITIAL_CORE_STATE);\n }\n\n /**\n * Check if a specific droppable is currently active.\n */\n isDroppableActive(droppableId: string): boolean {\n return this.#state().activeDroppableId === droppableId;\n }\n\n /**\n * Get the current state snapshot (for event creation).\n */\n getStateSnapshot(): DragState {\n return {\n ...this.#state(),\n cursorPosition: this.#cursorPosition(),\n keyboardTargetIndex: this.#keyboardTargetIndex(),\n };\n }\n\n /**\n * Update the keyboard target index (for keyboard drag navigation).\n * Also updates placeholder position to match, applying same-list adjustment.\n */\n setKeyboardTargetIndex(targetIndex: number): void {\n if (!this.#state().isDragging || !this.#state().isKeyboardDrag) {\n return;\n }\n\n const state = this.#state();\n // Same-list adjustment: if target is at or after source, add 1\n // This accounts for the hidden item shifting everything up visually\n const sourceDroppableId = state.draggedItem?.droppableId;\n const activeDroppableId = state.activeDroppableId;\n const isSameList = sourceDroppableId === activeDroppableId;\n const sourceIndex = state.sourceIndex ?? -1;\n\n let placeholderIndex = targetIndex;\n if (isSameList && sourceIndex >= 0 && targetIndex >= sourceIndex) {\n placeholderIndex = targetIndex + 1;\n }\n\n this.#keyboardTargetIndex.set(targetIndex);\n this.#state.update((s) => ({\n ...s,\n placeholderIndex,\n }));\n }\n\n /**\n * Update the active droppable during keyboard navigation (for cross-list moves).\n */\n setKeyboardActiveDroppable(droppableId: string | null, targetIndex: number): void {\n if (!this.#state().isDragging || !this.#state().isKeyboardDrag) {\n return;\n }\n\n const state = this.#state();\n // Same-list adjustment: if moving back to source list and target is at or after source, add 1\n const sourceDroppableId = state.draggedItem?.droppableId;\n const isSameList = sourceDroppableId === droppableId;\n const sourceIndex = state.sourceIndex ?? -1;\n\n let placeholderIndex = targetIndex;\n if (isSameList && sourceIndex >= 0 && targetIndex >= sourceIndex) {\n placeholderIndex = targetIndex + 1;\n }\n\n this.#keyboardTargetIndex.set(targetIndex);\n this.#state.update((s) => ({\n ...s,\n activeDroppableId: droppableId,\n placeholderIndex,\n }));\n }\n}\n","import { Injectable, isDevMode } from '@angular/core';\n\n/**\n * Service for calculating drop positions and finding elements at cursor positions.\n * This is the core algorithm that makes virtual scroll + drag-and-drop work together.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PositionCalculatorService {\n /** Data attribute used to identify droppable elements */\n readonly #DROPPABLE_ID_ATTR = 'data-droppable-id';\n\n /** Data attribute used to identify droppable groups */\n readonly #DROPPABLE_GROUP_ATTR = 'data-droppable-group';\n\n /** Data attribute used to identify draggable elements */\n readonly #DRAGGABLE_ID_ATTR = 'data-draggable-id';\n\n /** Maximum DOM levels to traverse when looking for parent elements */\n readonly #MAX_PARENT_TRAVERSAL = 15;\n\n /** Reusable result object for getNearEdge (avoids per-frame allocation) */\n readonly #nearEdgeResult = { top: false, bottom: false, left: false, right: false };\n\n /**\n * Find the droppable element at a given point.\n *\n * This works by temporarily hiding the dragged element, then using\n * document.elementFromPoint to find what's underneath the cursor.\n *\n * @param x - Cursor X coordinate\n * @param y - Cursor Y coordinate\n * @param draggedElement - The element being dragged (will be temporarily hidden)\n * @param groupName - The drag-and-drop group name to filter by\n * @returns The droppable element, or null if none found\n */\n findDroppableAtPoint(\n x: number,\n y: number,\n draggedElement: HTMLElement,\n groupName: string,\n ): HTMLElement | null {\n // Skip pointerEvents toggle when element is already hidden (display: none during active drag).\n // offsetParent is null for hidden elements — toggling style would force a style recalculation.\n const isHidden = draggedElement.offsetParent === null;\n\n let originalPointerEvents: string | undefined;\n if (!isHidden) {\n originalPointerEvents = draggedElement.style.pointerEvents;\n draggedElement.style.pointerEvents = 'none';\n }\n\n try {\n const elementAtPoint = document.elementFromPoint(x, y);\n if (!elementAtPoint) {\n return null;\n }\n\n return this.getDroppableParent(elementAtPoint as HTMLElement, groupName);\n } finally {\n if (!isHidden) {\n draggedElement.style.pointerEvents = originalPointerEvents!;\n }\n }\n }\n\n /**\n * Find the draggable element at a given point.\n *\n * @param x - Cursor X coordinate\n * @param y - Cursor Y coordinate\n * @param draggedElement - The element being dragged (will be temporarily hidden)\n * @returns The draggable element, or null if none found\n */\n findDraggableAtPoint(x: number, y: number, draggedElement: HTMLElement): HTMLElement | null {\n const isHidden = draggedElement.offsetParent === null;\n\n let originalPointerEvents: string | undefined;\n if (!isHidden) {\n originalPointerEvents = draggedElement.style.pointerEvents;\n draggedElement.style.pointerEvents = 'none';\n }\n\n try {\n const elementAtPoint = document.elementFromPoint(x, y);\n if (!elementAtPoint) {\n return null;\n }\n\n return this.getDraggableParent(elementAtPoint as HTMLElement);\n } finally {\n if (!isHidden) {\n draggedElement.style.pointerEvents = originalPointerEvents!;\n }\n }\n }\n\n /**\n * Walk up the DOM tree to find a droppable parent element.\n *\n * @param element - Starting element\n * @param groupName - The drag-and-drop group name to filter by\n * @returns The droppable parent element, or null if none found\n */\n getDroppableParent(element: HTMLElement, groupName: string): HTMLElement | null {\n let current: HTMLElement | null = element;\n let count = 0;\n\n while (current && current.tagName !== 'BODY' && count < this.#MAX_PARENT_TRAVERSAL) {\n const foundGroup = current.getAttribute(this.#DROPPABLE_GROUP_ATTR);\n\n if (foundGroup && foundGroup === groupName) {\n return current;\n }\n\n current = current.parentElement;\n count++;\n }\n\n return null;\n }\n\n /**\n * Walk up the DOM tree to find a draggable parent element.\n *\n * @param element - Starting element\n * @returns The draggable parent element, or null if none found\n */\n getDraggableParent(element: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = element;\n let count = 0;\n\n while (current && current.tagName !== 'BODY' && count < this.#MAX_PARENT_TRAVERSAL) {\n const draggableId = current.getAttribute(this.#DRAGGABLE_ID_ATTR);\n\n if (draggableId) {\n return current;\n }\n\n current = current.parentElement;\n count++;\n }\n\n return null;\n }\n\n /**\n * Get the draggable ID from an element.\n */\n getDraggableId(element: HTMLElement): string | null {\n return element.getAttribute(this.#DRAGGABLE_ID_ATTR);\n }\n\n /**\n * Get the droppable ID from an element.\n */\n getDroppableId(element: HTMLElement): string | null {\n return element.getAttribute(this.#DROPPABLE_ID_ATTR);\n }\n\n /**\n * Calculate the drop index based on mathematical position.\n *\n * This is an alternative approach that doesn't require the target element\n * to be in the DOM. Useful when the target might be virtualized away.\n *\n * @param scrollTop - Current scroll position of the container\n * @param cursorY - Cursor Y position (viewport-relative)\n * @param containerTop - Top position of the container (viewport-relative)\n * @param itemHeight - Height of each item\n * @param totalItems - Total number of items in the list\n * @returns The calculated drop index\n */\n calculateDropIndex(\n scrollTop: number,\n cursorY: number,\n containerTop: number,\n itemHeight: number,\n totalItems: number,\n ): number {\n // Calculate the position relative to the container's content\n const relativeY = cursorY - containerTop + scrollTop;\n\n // Calculate which item index this corresponds to\n const index = Math.floor(relativeY / itemHeight);\n\n // Clamp to valid range\n return Math.max(0, Math.min(index, totalItems));\n }\n\n /**\n * Check if a point is within a specific threshold of a container's edge.\n *\n * @param position - Current cursor position\n * @param containerRect - Container's bounding rect\n * @param threshold - Distance from edge to trigger (in pixels)\n * @returns Object indicating which edges are near\n */\n getNearEdge(\n position: { x: number; y: number },\n containerRect: DOMRect,\n threshold: number,\n ): { top: boolean; bottom: boolean; left: boolean; right: boolean } {\n this.#nearEdgeResult.top = position.y - containerRect.top <= threshold;\n this.#nearEdgeResult.bottom = containerRect.bottom - position.y <= threshold;\n this.#nearEdgeResult.left = position.x - containerRect.left <= threshold;\n this.#nearEdgeResult.right = containerRect.right - position.x <= threshold;\n return this.#nearEdgeResult;\n }\n\n /**\n * Determine if the cursor is inside a container.\n */\n isInsideContainer(position: { x: number; y: number }, containerRect: DOMRect): boolean {\n return (\n position.x >= containerRect.left &&\n position.x <= containerRect.right &&\n position.y >= containerRect.top &&\n position.y <= containerRect.bottom\n );\n }\n\n /**\n * Find an adjacent droppable in the specified direction (left or right).\n * Used for cross-list keyboard navigation.\n *\n * @param currentDroppableId - The ID of the current droppable\n * @param direction - 'left' or 'right'\n * @param groupName - The drag-and-drop group name\n * @returns Object with droppable info, or null if none found\n */\n findAdjacentDroppable(\n currentDroppableId: string,\n direction: 'left' | 'right',\n groupName: string,\n ): { element: HTMLElement; id: string; itemCount: number } | null {\n // Find all droppables in the same group\n const allDroppables = document.querySelectorAll(\n `[${this.#DROPPABLE_GROUP_ATTR}=\"${groupName}\"]`,\n );\n\n if (allDroppables.length <= 1) {\n return null;\n }\n\n // Get bounding rects and IDs, sorted by X position\n const droppableInfos: { element: HTMLElement; id: string; rect: DOMRect }[] = [];\n\n allDroppables.forEach((el) => {\n const htmlEl = el as HTMLElement;\n const id = htmlEl.getAttribute(this.#DROPPABLE_ID_ATTR);\n if (id) {\n droppableInfos.push({\n element: htmlEl,\n id,\n rect: htmlEl.getBoundingClientRect(),\n });\n }\n });\n\n // Sort by X position (left to right)\n droppableInfos.sort((a, b) => a.rect.left - b.rect.left);\n\n // Find current droppable index\n const currentIndex = droppableInfos.findIndex((d) => d.id === currentDroppableId);\n if (currentIndex === -1) {\n return null;\n }\n\n // Get the adjacent droppable\n const targetIndex = direction === 'left' ? currentIndex - 1 : currentIndex + 1;\n if (targetIndex < 0 || targetIndex >= droppableInfos.length) {\n return null;\n }\n\n const target = droppableInfos[targetIndex];\n\n // Get item count from the target droppable\n const itemCount = this.#getDroppableItemCount(target.element);\n\n return {\n element: target.element,\n id: target.id,\n itemCount,\n };\n }\n\n /**\n * Get the total item count in a droppable.\n * Uses spacer height and data attributes if available, otherwise counts DOM elements.\n */\n #getDroppableItemCount(droppableElement: HTMLElement): number {\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n if (virtualScroll) {\n const configuredHeight = virtualScroll.getAttribute('data-item-height');\n\n if (!configuredHeight) {\n if (isDevMode()) {\n console.error(\n '[ngx-virtual-dnd] vdnd-virtual-scroll requires data-item-height attribute ' +\n 'for keyboard navigation. Cross-list keyboard drag will not work correctly.',\n );\n }\n // Short-circuit: return 0 to prevent navigation to this droppable\n return 0;\n }\n\n // Prefer spacer height over scrollHeight for accuracy\n const spacer = virtualScroll.querySelector(\n '.vdnd-virtual-scroll-spacer',\n ) as HTMLElement | null;\n const totalHeight = spacer\n ? parseFloat(spacer.style.height) || 0\n : (virtualScroll as HTMLElement).scrollHeight;\n\n const itemHeight = parseInt(configuredHeight, 10);\n return Math.floor(totalHeight / itemHeight);\n }\n // Fallback for non-virtual scroll: DOM count is valid\n return droppableElement.querySelectorAll(`[${this.#DRAGGABLE_ID_ATTR}]`).length;\n }\n}\n","import { inject, Injectable, NgZone } from '@angular/core';\nimport { CursorPosition } from '../models/drag-drop.models';\nimport { DragStateService } from './drag-state.service';\nimport { PositionCalculatorService } from './position-calculator.service';\n\n/**\n * Configuration for auto-scroll behavior.\n */\nexport interface AutoScrollConfig {\n /** Distance from edge to start scrolling (in pixels) */\n threshold: number;\n /** Maximum scroll speed (in pixels per frame) */\n maxSpeed: number;\n /** Whether to accelerate scroll based on distance from edge */\n accelerate: boolean;\n}\n\n/**\n * Default auto-scroll configuration.\n */\nconst DEFAULT_CONFIG: AutoScrollConfig = {\n threshold: 50,\n maxSpeed: 15,\n accelerate: true,\n};\n\n/**\n * Service that handles auto-scrolling when dragging near container edges.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AutoScrollService {\n readonly #dragState = inject(DragStateService);\n readonly #positionCalculator = inject(PositionCalculatorService);\n readonly #ngZone = inject(NgZone);\n\n /** Currently registered scrollable containers */\n #scrollableContainers = new Map<\n string,\n {\n element: HTMLElement;\n config: AutoScrollConfig;\n }\n >();\n\n /** Active animation frame ID */\n #animationFrameId: number | null = null;\n\n /** Callback to invoke when scrolling occurs (for placeholder recalculation) */\n #onScrollCallback: (() => void) | null = null;\n\n /** Optional cursor position override for edge detection (bypasses DragState read) */\n #cursorOverride: CursorPosition | null = null;\n\n /** Last tick cursor position for stationary detection */\n #lastTickCursorX = NaN;\n #lastTickCursorY = NaN;\n\n /** Reusable direction object for tick loop (avoids per-frame allocation) */\n readonly #tickDirection = { x: 0, y: 0 };\n\n /** Current scroll state */\n readonly #scrollState: {\n containerId: string | null;\n direction: { x: number; y: number };\n speed: number;\n } = {\n containerId: null,\n direction: { x: 0, y: 0 },\n speed: 0,\n };\n\n /**\n * Register a scrollable container for auto-scrolling.\n */\n registerContainer(\n id: string,\n element: HTMLElement,\n config: Partial<AutoScrollConfig> = {},\n ): void {\n this.#scrollableContainers.set(id, {\n element,\n config: { ...DEFAULT_CONFIG, ...config },\n });\n }\n\n /**\n * Unregister a scrollable container.\n */\n unregisterContainer(id: string): void {\n this.#scrollableContainers.delete(id);\n }\n\n /**\n * Start monitoring for auto-scroll.\n * Call this when a drag starts.\n * @param onScroll Optional callback to invoke when scrolling occurs (for placeholder recalculation)\n */\n startMonitoring(onScroll?: () => void): void {\n if (this.#animationFrameId !== null) {\n return;\n }\n\n this.#onScrollCallback = onScroll ?? null;\n\n this.#ngZone.runOutsideAngular(() => {\n this.#tick();\n });\n }\n\n /**\n * Stop monitoring for auto-scroll.\n * Call this when a drag ends.\n */\n stopMonitoring(): void {\n if (this.#animationFrameId !== null) {\n cancelAnimationFrame(this.#animationFrameId);\n this.#animationFrameId = null;\n }\n\n this.#onScrollCallback = null;\n this.#cursorOverride = null;\n this.#lastTickCursorX = NaN;\n this.#lastTickCursorY = NaN;\n this.#scrollState.containerId = null;\n this.#scrollState.direction.x = 0;\n this.#scrollState.direction.y = 0;\n this.#scrollState.speed = 0;\n }\n\n /**\n * Override the cursor position used for edge detection.\n * When set, #tick() uses this instead of DragStateService.cursorPosition().\n * Used by constrainToContainer to provide a position without grabOffset distortion.\n * @internal\n */\n setCursorOverride(position: CursorPosition): void {\n this.#cursorOverride = position;\n }\n\n /**\n * Animation tick - check cursor position and scroll if needed.\n */\n #tick(): void {\n const cursor = this.#cursorOverride ?? this.#dragState.cursorPosition();\n const isDragging = this.#dragState.isDragging();\n\n // Stop monitoring if drag ended\n if (!isDragging) {\n this.stopMonitoring();\n return;\n }\n\n // Skip this frame if no cursor position yet, but continue monitoring\n if (!cursor) {\n this.#animationFrameId = requestAnimationFrame(() => this.#tick());\n return;\n }\n\n // Skip container iteration when cursor hasn't moved and no scrolling is active\n if (\n cursor.x === this.#lastTickCursorX &&\n cursor.y === this.#lastTickCursorY &&\n !this.isScrolling()\n ) {\n this.#animationFrameId = requestAnimationFrame(() => this.#tick());\n return;\n }\n this.#lastTickCursorX = cursor.x;\n this.#lastTickCursorY = cursor.y;\n\n let scrollPerformed = false;\n\n // Check each container\n for (const [id, { element, config }] of this.#scrollableContainers) {\n const rect = element.getBoundingClientRect();\n\n // Check if cursor is inside this container\n const isInside = this.#positionCalculator.isInsideContainer(cursor, rect);\n\n if (!isInside) {\n continue;\n }\n\n // Check edges\n const nearEdge = this.#positionCalculator.getNearEdge(cursor, rect, config.threshold);\n\n // Calculate scroll direction and speed (reuse object to avoid per-frame allocation)\n const direction = this.#tickDirection;\n direction.x = 0;\n direction.y = 0;\n let maxDistance = 0;\n\n if (nearEdge.top) {\n direction.y = -1;\n maxDistance = Math.max(maxDistance, config.threshold - (cursor.y - rect.top));\n } else if (nearEdge.bottom) {\n direction.y = 1;\n maxDistance = Math.max(maxDistance, config.threshold - (rect.bottom - cursor.y));\n }\n\n if (nearEdge.left) {\n direction.x = -1;\n maxDistance = Math.max(maxDistance, config.threshold - (cursor.x - rect.left));\n } else if (nearEdge.right) {\n direction.x = 1;\n maxDistance = Math.max(maxDistance, config.threshold - (rect.right - cursor.x));\n }\n\n // If near an edge, start scrolling\n if (direction.x !== 0 || direction.y !== 0) {\n // Calculate speed (accelerate based on distance from edge)\n let speed = config.maxSpeed;\n if (config.accelerate) {\n const distanceRatio = maxDistance / config.threshold;\n speed = Math.min(config.maxSpeed, Math.max(1, config.maxSpeed * distanceRatio));\n }\n\n this.#scrollState.containerId = id;\n this.#scrollState.direction.x = direction.x;\n this.#scrollState.direction.y = direction.y;\n this.#scrollState.speed = speed;\n this.#performScroll(element, direction, speed);\n scrollPerformed = true;\n break;\n }\n }\n\n // Reset scroll state if no scrolling was performed\n if (!scrollPerformed) {\n this.#scrollState.containerId = null;\n this.#scrollState.direction.x = 0;\n this.#scrollState.direction.y = 0;\n this.#scrollState.speed = 0;\n }\n\n this.#animationFrameId = requestAnimationFrame(() => this.#tick());\n }\n\n /**\n * Perform the actual scroll operation.\n */\n #performScroll(element: HTMLElement, direction: { x: number; y: number }, speed: number): void {\n const scrollX = direction.x * speed;\n const scrollY = direction.y * speed;\n\n // Check bounds before scrolling\n const maxScrollY = element.scrollHeight - element.clientHeight;\n const maxScrollX = element.scrollWidth - element.clientWidth;\n\n if (direction.y < 0 && element.scrollTop <= 0) {\n return;\n }\n if (direction.y > 0 && element.scrollTop >= maxScrollY) {\n return;\n }\n if (direction.x < 0 && element.scrollLeft <= 0) {\n return;\n }\n if (direction.x > 0 && element.scrollLeft >= maxScrollX) {\n return;\n }\n\n // Use direct property assignment for guaranteed synchronous scroll\n // scrollBy() with 'instant' behavior may have async issues in Safari\n if (scrollY !== 0) {\n element.scrollTop += scrollY;\n }\n if (scrollX !== 0) {\n element.scrollLeft += scrollX;\n }\n\n // Notify callback IMMEDIATELY in the same frame (no RAF delay)\n // Delaying via RAF causes cumulative drift during continuous autoscroll\n // because multiple scrolls happen before each delayed callback runs.\n // Note: No ngZone.run() needed here - the callback (DraggableDirective.#recalculatePlaceholder)\n // already enters the zone when updating drag state.\n this.#onScrollCallback?.();\n }\n\n /**\n * Check if auto-scrolling is currently active.\n */\n isScrolling(): boolean {\n return (\n this.#scrollState.containerId !== null &&\n (this.#scrollState.direction.x !== 0 || this.#scrollState.direction.y !== 0)\n );\n }\n\n /**\n * Get the current scroll direction.\n */\n getScrollDirection(): { x: number; y: number } {\n return this.#scrollState.direction;\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Service for cloning DOM elements with their computed styles.\n * Used to create visual copies of dragged elements for the drag preview.\n */\n@Injectable({ providedIn: 'root' })\nexport class ElementCloneService {\n /**\n * CSS properties to copy from source to clone.\n * These are the visual properties that affect appearance.\n */\n readonly #stylesToCopy = [\n 'background',\n 'backgroundColor',\n 'backgroundImage',\n 'border',\n 'borderRadius',\n 'boxShadow',\n 'color',\n 'font',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'lineHeight',\n 'padding',\n 'margin',\n 'display',\n 'flexDirection',\n 'alignItems',\n 'justifyContent',\n 'gap',\n 'textAlign',\n 'textDecoration',\n 'width',\n 'height',\n 'minWidth',\n 'minHeight',\n 'maxWidth',\n 'maxHeight',\n 'overflow',\n 'opacity',\n 'transform',\n 'boxSizing',\n ];\n\n /**\n * Clone an element with its computed styles.\n * Returns an HTMLElement ready for use as a drag preview.\n */\n cloneElement(source: HTMLElement): HTMLElement {\n const clone = source.cloneNode(true) as HTMLElement;\n\n // Apply computed styles as inline styles\n this.#applyComputedStyles(source, clone);\n\n // Handle special elements (canvas, video, etc.)\n this.#handleSpecialElements(source, clone);\n\n // Sanitize the clone for safe use as preview\n this.#sanitizeClone(clone);\n\n return clone;\n }\n\n /**\n * Apply computed styles from source to target element.\n * Recursively applies to all child elements.\n */\n #applyComputedStyles(source: HTMLElement, target: HTMLElement): void {\n const computed = window.getComputedStyle(source);\n\n // Copy essential visual properties\n for (const prop of this.#stylesToCopy) {\n const value = computed.getPropertyValue(this.#camelToKebab(prop));\n if (value) {\n target.style.setProperty(this.#camelToKebab(prop), value);\n }\n }\n\n // Disable animations and transitions on clone\n target.style.animation = 'none';\n target.style.transition = 'none';\n\n // Recursively apply to children\n const sourceChildren = source.children;\n const targetChildren = target.children;\n\n for (let i = 0; i < sourceChildren.length && i < targetChildren.length; i++) {\n const sourceChild = sourceChildren[i];\n const targetChild = targetChildren[i];\n\n if (sourceChild instanceof HTMLElement && targetChild instanceof HTMLElement) {\n this.#applyComputedStyles(sourceChild, targetChild);\n }\n }\n }\n\n /**\n * Handle special elements that require extra processing.\n */\n #handleSpecialElements(source: HTMLElement, clone: HTMLElement): void {\n // Handle canvas elements - copy current content\n const sourceCanvases = source.querySelectorAll('canvas');\n const cloneCanvases = clone.querySelectorAll('canvas');\n\n sourceCanvases.forEach((srcCanvas, i) => {\n const cloneCanvas = cloneCanvases[i] as HTMLCanvasElement;\n if (cloneCanvas) {\n const ctx = cloneCanvas.getContext('2d');\n if (ctx) {\n cloneCanvas.width = srcCanvas.width;\n cloneCanvas.height = srcCanvas.height;\n ctx.drawImage(srcCanvas, 0, 0);\n }\n }\n });\n\n // Handle video elements - replace with poster or placeholder\n const videos = clone.querySelectorAll('video');\n videos.forEach((video) => {\n const poster = video.poster;\n if (poster) {\n const img = document.createElement('img');\n img.src = poster;\n img.style.width = '100%';\n img.style.height = '100%';\n img.style.objectFit = 'cover';\n video.replaceWith(img);\n } else {\n // Create a placeholder\n const placeholder = document.createElement('div');\n placeholder.style.cssText = `\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n video.replaceWith(placeholder);\n }\n });\n\n // Handle iframes - replace with placeholder\n const iframes = clone.querySelectorAll('iframe');\n iframes.forEach((iframe) => {\n const placeholder = document.createElement('div');\n const iframeStyles = window.getComputedStyle(iframe);\n placeholder.style.width = iframeStyles.width;\n placeholder.style.height = iframeStyles.height;\n placeholder.style.display = 'flex';\n placeholder.style.alignItems = 'center';\n placeholder.style.justifyContent = 'center';\n iframe.replaceWith(placeholder);\n });\n }\n\n /**\n * Sanitize the clone to prevent interaction issues.\n */\n #sanitizeClone(clone: HTMLElement): void {\n // Remove draggable directive attributes\n clone.removeAttribute('vdndDraggable');\n clone.removeAttribute('data-draggable-id');\n clone.removeAttribute('data-droppable-id');\n\n // Remove Angular-specific attributes\n const angularAttrs = Array.from(clone.attributes).filter(\n (attr) => attr.name.startsWith('ng-') || attr.name.startsWith('_ng'),\n );\n angularAttrs.forEach((attr) => clone.removeAttribute(attr.name));\n\n // Process all descendant elements\n const allElements = clone.querySelectorAll('*');\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n\n // Remove event-related attributes\n const attrs = Array.from(el.attributes);\n attrs.forEach((attr) => {\n if (\n attr.name.startsWith('on') ||\n attr.name.startsWith('(') ||\n attr.name.startsWith('ng-') ||\n attr.name.startsWith('_ng')\n ) {\n el.removeAttribute(attr.name);\n }\n });\n\n // Remove draggable attributes from children too\n el.removeAttribute('vdndDraggable');\n el.removeAttribute('data-draggable-id');\n el.removeAttribute('data-droppable-id');\n });\n\n // Disable interactive elements\n const interactiveElements = clone.querySelectorAll(\n 'button, input, textarea, select, a, [contenteditable]',\n );\n interactiveElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.pointerEvents = 'none';\n el.setAttribute('tabindex', '-1');\n el.setAttribute('aria-hidden', 'true');\n el.setAttribute('disabled', 'true');\n }\n });\n\n // Remove focus styling classes that might interfere\n clone.classList.remove('vdnd-draggable-dragging');\n clone.classList.remove('vdnd-draggable-disabled');\n }\n\n /**\n * Convert camelCase to kebab-case for CSS properties.\n */\n #camelToKebab(str: string): string {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { DragStateService } from './drag-state.service';\nimport { DraggedItem, END_OF_LIST, GrabOffset } from '../models/drag-drop.models';\n\n/**\n * Service for managing keyboard-initiated drag operations.\n * Works in conjunction with DragStateService to provide keyboard drag functionality.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardDragService {\n readonly #dragState = inject(DragStateService);\n\n /** Total item count for the current droppable (set by droppable on keyboard drag start) */\n readonly #totalItemCount = signal<number>(0);\n\n /** Whether a keyboard drag is currently active */\n readonly isActive = computed(\n () => this.#dragState.isKeyboardDrag() && this.#dragState.isDragging(),\n );\n\n /** Current target index during keyboard navigation */\n readonly targetIndex = computed(() => this.#dragState.keyboardTargetIndex());\n\n /** Source index where the drag started */\n readonly sourceIndex = computed(() => this.#dragState.sourceIndex());\n\n /** Current active droppable ID */\n readonly activeDroppableId = computed(() => this.#dragState.activeDroppableId());\n\n /**\n * Start a keyboard drag operation.\n */\n startKeyboardDrag(\n item: DraggedItem,\n sourceIndex: number,\n totalItemCount: number,\n activeDroppableId: string,\n ): void {\n this.#totalItemCount.set(totalItemCount);\n\n // For keyboard drag, we position the preview at the element's location\n // We use a grab offset of 0,0 since we're not grabbing at a specific point\n const grabOffset: GrabOffset = { x: 0, y: 0 };\n\n // Get the element's position for the cursor position\n // This positions the preview at the element's original location\n const rect = item.element.getBoundingClientRect();\n const cursorPosition = { x: rect.left, y: rect.top };\n\n // Same-list adjustment: at start, targetIndex equals sourceIndex\n // Since sourceIndex >= sourceIndex is always true, add 1 to placeholderIndex\n // This accounts for the hidden item shifting everything up visually\n const initialPlaceholderIndex = sourceIndex + 1;\n\n this.#dragState.startDrag(\n item,\n cursorPosition,\n grabOffset,\n null, // no axis lock for keyboard drag\n activeDroppableId,\n END_OF_LIST,\n initialPlaceholderIndex,\n sourceIndex,\n true, // isKeyboardDrag\n );\n }\n\n /**\n * Move to a specific index during keyboard drag.\n * Returns the clamped target index.\n */\n moveToIndex(targetIndex: number): number {\n if (!this.isActive()) {\n return targetIndex;\n }\n\n const totalItems = this.#totalItemCount();\n const clampedIndex = Math.max(0, Math.min(targetIndex, totalItems));\n\n this.#dragState.setKeyboardTargetIndex(clampedIndex);\n\n return clampedIndex;\n }\n\n /**\n * Move up by one position (ArrowUp).\n * Returns the new target index.\n */\n moveUp(): number {\n const currentTarget = this.targetIndex() ?? 0;\n return this.moveToIndex(currentTarget - 1);\n }\n\n /**\n * Move down by one position (ArrowDown).\n * Returns the new target index.\n */\n moveDown(): number {\n const currentTarget = this.targetIndex() ?? 0;\n return this.moveToIndex(currentTarget + 1);\n }\n\n /**\n * Move to an adjacent droppable (ArrowLeft/ArrowRight).\n * The droppable registry is managed externally.\n */\n moveToDroppable(droppableId: string, targetIndex: number, totalItemCount: number): void {\n if (!this.isActive()) {\n return;\n }\n\n this.#totalItemCount.set(totalItemCount);\n const clampedIndex = Math.max(0, Math.min(targetIndex, totalItemCount));\n this.#dragState.setKeyboardActiveDroppable(droppableId, clampedIndex);\n }\n\n /**\n * Complete the keyboard drag (Space or Enter to drop).\n */\n completeKeyboardDrag(): void {\n if (!this.isActive()) {\n return;\n }\n\n this.#dragState.endDrag();\n }\n\n /**\n * Cancel the keyboard drag (Escape).\n */\n cancelKeyboardDrag(): void {\n if (!this.isActive()) {\n return;\n }\n\n this.#dragState.cancelDrag();\n }\n\n /**\n * Update the total item count (when navigating to a new list).\n */\n setTotalItemCount(count: number): void {\n this.#totalItemCount.set(count);\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\n\n/**\n * Service that manages a shared overlay container appended to `document.body`.\n *\n * Elements placed inside the overlay container escape any ancestor CSS `transform`,\n * `perspective`, or `filter` that would create a new containing block for\n * `position: fixed` children. This ensures viewport-relative positioning works\n * correctly regardless of where the consuming component sits in the DOM tree.\n *\n * Mirrors the strategy used by Angular CDK's `OverlayContainer`.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class OverlayContainerService implements OnDestroy {\n #containerElement: HTMLElement | null = null;\n\n /**\n * Returns the shared overlay container element, lazily creating it on first access.\n * Returns `null` in non-browser environments (SSR).\n */\n getContainerElement(): HTMLElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (!this.#containerElement) {\n this.#containerElement = document.createElement('div');\n this.#containerElement.classList.add('vdnd-overlay-container');\n document.body.appendChild(this.#containerElement);\n }\n\n return this.#containerElement;\n }\n\n ngOnDestroy(): void {\n this.#containerElement?.remove();\n this.#containerElement = null;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { type CursorPosition, END_OF_LIST, type GrabOffset } from '../models/drag-drop.models';\nimport { PositionCalculatorService } from './position-calculator.service';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\n\ninterface DroppableCache {\n droppableId: string | null;\n containerType: 'virtualScroll' | 'virtualContent' | 'fallback';\n scrollContainer: HTMLElement;\n virtualScrollElement: HTMLElement | null;\n virtualContentElement: HTMLElement | null;\n scrollableParent: HTMLElement | null;\n itemHeight: number;\n isConstrainedToContainer: boolean;\n strategy: VirtualScrollStrategy | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DragIndexCalculatorService {\n readonly #positionCalculator = inject(PositionCalculatorService);\n\n /** Registered strategies by droppable ID */\n readonly #strategies = new Map<string, VirtualScrollStrategy>();\n\n /** Cached droppable metadata to avoid repeated DOM queries during drag */\n readonly #droppableCache = new Map<HTMLElement, DroppableCache>();\n\n /**\n * Register a virtual scroll strategy for a droppable.\n * Used by virtual scroll components to provide dynamic height lookups.\n */\n registerStrategy(droppableId: string, strategy: VirtualScrollStrategy): void {\n this.#strategies.set(droppableId, strategy);\n }\n\n /**\n * Unregister a strategy when the droppable is destroyed.\n */\n unregisterStrategy(droppableId: string): void {\n this.#strategies.delete(droppableId);\n }\n\n /**\n * Get the registered strategy for a droppable ID.\n * Used by draggable to calculate source index with variable heights.\n */\n getStrategyForDroppable(droppableId: string): VirtualScrollStrategy | undefined {\n return this.#strategies.get(droppableId);\n }\n\n clearCache(): void {\n this.#droppableCache.clear();\n }\n\n #resolveDroppable(droppableElement: HTMLElement, draggedItemHeight: number): DroppableCache {\n const cached = this.#droppableCache.get(droppableElement);\n if (cached) return cached;\n\n const virtualScrollElement = droppableElement.querySelector(\n 'vdnd-virtual-scroll',\n ) as HTMLElement | null;\n const virtualContentElement = (\n droppableElement.matches('vdnd-virtual-content')\n ? droppableElement\n : droppableElement.closest('vdnd-virtual-content')\n ) as HTMLElement | null;\n\n let containerType: DroppableCache['containerType'];\n let scrollContainer: HTMLElement;\n let scrollableParent: HTMLElement | null = null;\n\n if (virtualScrollElement) {\n containerType = 'virtualScroll';\n scrollContainer = virtualScrollElement;\n } else if (virtualContentElement) {\n containerType = 'virtualContent';\n scrollableParent = virtualContentElement.closest('.vdnd-scrollable') as HTMLElement | null;\n scrollContainer = scrollableParent ?? virtualContentElement;\n } else {\n containerType = 'fallback';\n scrollContainer = droppableElement;\n }\n\n const droppableId = this.#positionCalculator.getDroppableId(droppableElement);\n const strategy = (droppableId ? this.#strategies.get(droppableId) : null) ?? null;\n\n const configuredHeight =\n virtualScrollElement?.getAttribute('data-item-height') ??\n virtualContentElement?.getAttribute('data-item-height');\n const parsedHeight = configuredHeight ? parseFloat(configuredHeight) : Number.NaN;\n const itemHeight = Number.isFinite(parsedHeight)\n ? parsedHeight\n : this.#getDraggedItemHeightFallback(draggedItemHeight, 50);\n\n const isConstrainedToContainer = droppableElement.hasAttribute('data-constrain-to-container');\n\n const entry: DroppableCache = {\n droppableId,\n containerType,\n scrollContainer,\n virtualScrollElement,\n virtualContentElement,\n scrollableParent,\n itemHeight,\n isConstrainedToContainer,\n strategy,\n };\n\n this.#droppableCache.set(droppableElement, entry);\n return entry;\n }\n\n getTotalItemCount(args: {\n droppableElement: HTMLElement;\n isSameList: boolean;\n draggedItemHeight: number;\n }): number {\n return this.#getTotalItemCount(args.droppableElement, args.isSameList, args.draggedItemHeight);\n }\n\n calculatePlaceholderIndex(args: {\n droppableElement: HTMLElement;\n position: CursorPosition;\n previousPosition: CursorPosition | null;\n grabOffset: GrabOffset | null;\n draggedItemHeight: number;\n sourceDroppableId: string | null;\n sourceIndex: number | null;\n }): { index: number; placeholderId: string } {\n const {\n droppableElement,\n position,\n grabOffset,\n draggedItemHeight,\n sourceDroppableId,\n sourceIndex,\n } = args;\n\n // Resolve cached metadata (DOM queries run once per droppable per drag session)\n const cache = this.#resolveDroppable(droppableElement, draggedItemHeight);\n\n // Live reads: getBoundingClientRect() and scrollTop change during scroll\n let currentScrollTop: number;\n let rect: DOMRect;\n\n if (cache.containerType === 'virtualScroll') {\n rect = cache.scrollContainer.getBoundingClientRect();\n currentScrollTop = cache.scrollContainer.scrollTop;\n } else if (cache.containerType === 'virtualContent' && cache.scrollableParent) {\n rect = cache.scrollContainer.getBoundingClientRect();\n const contentOffsetAttr = cache.virtualContentElement!.getAttribute('data-content-offset');\n const contentOffset = contentOffsetAttr ? parseFloat(contentOffsetAttr) : 0;\n const offsetValue = Number.isFinite(contentOffset) ? contentOffset : 0;\n currentScrollTop = cache.scrollContainer.scrollTop - offsetValue;\n } else {\n rect = cache.scrollContainer.getBoundingClientRect();\n currentScrollTop =\n cache.containerType === 'virtualContent' ? 0 : cache.scrollContainer.scrollTop;\n }\n\n const {\n strategy,\n itemHeight,\n droppableId: currentDroppableId,\n isConstrainedToContainer,\n } = cache;\n\n // Calculate preview center position mathematically\n // The preview is positioned at: cursorPosition - grabOffset (see drag-preview.component.ts)\n // So preview center = cursorPosition.y - grabOffset.y + previewHeight/2\n // Using math avoids Safari's stale getBoundingClientRect() issue during autoscroll\n // Use actual dragged item height when available (important for dynamic heights)\n const previewHeight = this.#getDraggedItemHeightFallback(draggedItemHeight, itemHeight);\n const previewTopY = position.y - (grabOffset?.y ?? 0);\n const previewBottomY = previewTopY + previewHeight;\n const previewCenterY = previewTopY + previewHeight / 2;\n\n // Capped center probe: use preview center but limit how deep the probe reaches.\n // The cap prevents a tall preview (e.g. 120px among 60px items) from overshooting\n // multiple positions — the center would land 2+ items away, but the cap keeps it\n // within one item of the top edge.\n const indexProbeY = Math.min(previewCenterY, previewTopY + itemHeight / 2);\n\n // Convert to visual index\n const relativeY = indexProbeY - rect.top + currentScrollTop;\n\n // Determine same-list drag info before strategy branch\n const isSameList = sourceDroppableId !== null && sourceDroppableId === currentDroppableId;\n const sourceIndexValue = isSameList ? (sourceIndex ?? -1) : -1;\n\n let visualIndex: number;\n if (strategy) {\n visualIndex = strategy.findIndexAtOffset(relativeY);\n\n // Midpoint refinement for variable heights:\n // Only advance past an item when the preview top has crossed its midpoint.\n // Without this, a short preview entering a tall item's range triggers\n // displacement at ~20% overlap, which looks like unnatural overlapping.\n const topRelativeY = previewTopY - rect.top + currentScrollTop;\n const targetTop = strategy.getOffsetForIndex(visualIndex);\n const targetBottom = strategy.getOffsetForIndex(visualIndex + 1);\n const targetMidpoint = (targetTop + targetBottom) / 2;\n if (topRelativeY >= targetMidpoint) {\n visualIndex += 1;\n }\n } else {\n // Fixed height: simple division\n visualIndex = Math.floor(relativeY / itemHeight);\n }\n\n // Same-list +1 adjustment:\n // - No strategy: always adjust when visual index is at/after source\n // - Strategy: adjust only if exclusion has not been applied yet\n // (prevents an off-by-one window during early drag updates)\n let placeholderIndex = visualIndex;\n if (isSameList && sourceIndexValue >= 0 && visualIndex >= sourceIndexValue) {\n const needsAdjustment = !strategy || !this.#isSourceIndexExcluded(strategy, sourceIndexValue);\n if (needsAdjustment) {\n placeholderIndex = visualIndex + 1;\n }\n }\n\n // Get total items using cached strategy to avoid duplicate DOM queries\n let totalItems: number;\n const cachedItemCount = strategy?.getItemCount();\n if (cachedItemCount !== undefined && Number.isFinite(cachedItemCount)) {\n totalItems = Math.max(0, cachedItemCount);\n } else {\n totalItems = this.#getTotalItemCount(droppableElement, isSameList, draggedItemHeight);\n }\n\n // Edge detection: allow dropping at the END of the list when cursor is near bottom edge.\n // Due to max scroll limits, the math alone can't reach totalItems when the list is longer\n // than the viewport. If cursor is in the bottom portion of the container and we're at\n // or past the last visible slot, snap to totalItems.\n const cursorRelativeToBottom = rect.bottom - previewCenterY;\n const isNearBottomEdge = cursorRelativeToBottom < itemHeight;\n if (isNearBottomEdge && placeholderIndex >= totalItems - 1) {\n placeholderIndex = totalItems;\n }\n\n // When the preview is constrained to the container bounds, large dragged items can\n // cover the first/last slots while their center never reaches them. Snap to edges\n // using preview bounds so top/bottom drops remain reachable.\n if (isConstrainedToContainer) {\n const droppableRect = droppableElement.getBoundingClientRect();\n const edgeTolerance = 2;\n const distanceToTop = Math.abs(previewTopY - droppableRect.top);\n const distanceToBottom = Math.abs(droppableRect.bottom - previewBottomY);\n\n if (distanceToTop <= edgeTolerance && distanceToTop <= distanceToBottom) {\n placeholderIndex = 0;\n } else if (distanceToBottom <= edgeTolerance) {\n placeholderIndex = totalItems;\n }\n }\n\n // Clamp to valid range\n placeholderIndex = Math.max(0, Math.min(placeholderIndex, totalItems));\n\n return { index: placeholderIndex, placeholderId: END_OF_LIST };\n }\n\n #getTotalItemCount(\n droppableElement: HTMLElement,\n isSameList: boolean,\n draggedItemHeight: number,\n ): number {\n // Check if a registered strategy exists\n const droppableId = this.#positionCalculator.getDroppableId(droppableElement);\n const strategy = droppableId ? this.#strategies.get(droppableId) : null;\n const strategyItemCount = strategy?.getItemCount();\n if (strategyItemCount !== undefined && Number.isFinite(strategyItemCount)) {\n return Math.max(0, strategyItemCount);\n }\n\n // Check for embedded virtual scroll component\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n if (virtualScroll) {\n // Use data-total-items attribute if available (always the true N)\n const totalItemsAttr = virtualScroll.getAttribute('data-total-items');\n if (totalItemsAttr) {\n const count = parseInt(totalItemsAttr, 10);\n if (Number.isFinite(count)) {\n return count;\n }\n }\n\n // Fallback: Use the spacer's height, NOT scrollHeight, to determine item count.\n // scrollHeight can be inflated by absolutely-positioned elements like the placeholder.\n const spacer = virtualScroll.querySelector(\n '.vdnd-virtual-scroll-spacer',\n ) as HTMLElement | null;\n const configuredHeight = virtualScroll.getAttribute('data-item-height');\n const itemHeight = configuredHeight\n ? parseInt(configuredHeight, 10)\n : this.#getDraggedItemHeightFallback(draggedItemHeight, 50);\n\n let totalHeight: number;\n if (spacer) {\n // Get the spacer's explicit height (set via Angular binding)\n totalHeight = parseFloat(spacer.style.height) || 0;\n } else {\n // Fallback: use scrollHeight if spacer not found\n totalHeight = (virtualScroll as HTMLElement).scrollHeight;\n }\n\n // When strategy exists, spacer height already accounts for exclusion.\n // Don't apply same-list +1 adjustment — strategy handles it.\n if (strategy) {\n const count = Math.round(totalHeight / itemHeight);\n return count;\n }\n\n // Spacer height reflects full N items (getTotalHeight no longer excludes)\n const count = Math.floor(totalHeight / itemHeight);\n return count;\n }\n\n // Check for page-level scroll (vdnd-virtual-content)\n const virtualContent = droppableElement.matches('vdnd-virtual-content')\n ? droppableElement\n : droppableElement.closest('vdnd-virtual-content');\n if (virtualContent) {\n // Prefer explicit total items attribute (works for both fixed and dynamic heights)\n const totalItemsAttr = (virtualContent as HTMLElement).getAttribute('data-total-items');\n if (totalItemsAttr) {\n const count = parseInt(totalItemsAttr, 10);\n if (Number.isFinite(count)) {\n // data-total-items is the true total N (derived from strategy item count)\n return count;\n }\n }\n\n // Fallback: use spacer height to determine total items\n const spacer = virtualContent.querySelector('.vdnd-content-spacer') as HTMLElement | null;\n if (spacer) {\n const totalHeight = parseFloat(spacer.style.height) || 0;\n const configuredHeight = virtualContent.getAttribute('data-item-height');\n const itemHeight = configuredHeight\n ? parseInt(configuredHeight, 10)\n : this.#getDraggedItemHeightFallback(draggedItemHeight, 72);\n return Math.floor(totalHeight / itemHeight);\n }\n }\n\n // Fallback for non-virtual scroll — querySelectorAll finds all N items\n // (including the hidden dragged item), so no adjustment needed\n const items = droppableElement.querySelectorAll('[data-draggable-id]');\n return items.length;\n }\n\n #getDraggedItemHeightFallback(height: number, fallback: number): number {\n return Number.isFinite(height) && height > 0 ? height : fallback;\n }\n\n /**\n * Detect whether a strategy has already excluded the source index.\n *\n * With exclusion applied, the source slot collapses in visual space:\n * offset(sourceIndex + 1) <= offset(sourceIndex). Without exclusion,\n * the next offset is strictly greater.\n */\n #isSourceIndexExcluded(strategy: VirtualScrollStrategy, sourceIndex: number): boolean {\n if (sourceIndex < 0) {\n return false;\n }\n\n const sourceOffset = strategy.getOffsetForIndex(sourceIndex);\n const nextOffset = strategy.getOffsetForIndex(sourceIndex + 1);\n\n return nextOffset <= sourceOffset;\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Renders an empty placeholder that takes up space in the document flow.\n *\n * This component is used internally by virtual scroll containers to show\n * where an item will be dropped. It's rendered inline with items and\n * takes up the same vertical space as an item.\n *\n * The placeholder is just empty space - no borders, no background.\n * Consumers can style it via CSS if desired.\n */\n@Component({\n selector: 'vdnd-drag-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'vdnd-drag-placeholder vdnd-drag-placeholder-visible',\n '[style.height.px]': 'itemHeight()',\n },\n styles: `\n :host {\n display: block;\n pointer-events: none;\n }\n `,\n template: ``,\n})\nexport class DragPlaceholderComponent {\n /** Item height for sizing */\n itemHeight = input.required<number>();\n}\n","import { NgZone, type WritableSignal } from '@angular/core';\n\nexport function bindRafThrottledScrollTopSignal(options: {\n element: HTMLElement;\n ngZone: NgZone;\n scrollTop: WritableSignal<number>;\n thresholdPx?: number;\n onCommit?: (scrollTop: number) => void;\n}): () => void {\n const { element, ngZone, scrollTop, thresholdPx = 5, onCommit } = options;\n\n let pendingRaf: number | null = null;\n let lastCommittedScrollTop = element.scrollTop;\n\n const onScroll = () => {\n if (pendingRaf !== null) {\n return;\n }\n\n const currentScrollTop = element.scrollTop;\n if (Math.abs(currentScrollTop - lastCommittedScrollTop) < thresholdPx) {\n return;\n }\n\n pendingRaf = requestAnimationFrame(() => {\n pendingRaf = null;\n const finalScrollTop = element.scrollTop;\n if (Math.abs(finalScrollTop - lastCommittedScrollTop) >= thresholdPx) {\n lastCommittedScrollTop = finalScrollTop;\n scrollTop.set(finalScrollTop);\n onCommit?.(finalScrollTop);\n }\n });\n };\n\n ngZone.runOutsideAngular(() => {\n element.addEventListener('scroll', onScroll, { passive: true });\n });\n\n scrollTop.set(lastCommittedScrollTop);\n\n return () => {\n if (pendingRaf !== null) {\n cancelAnimationFrame(pendingRaf);\n pendingRaf = null;\n }\n element.removeEventListener('scroll', onScroll);\n };\n}\n\nexport function bindResizeObserverHeightSignal(options: {\n element: HTMLElement;\n ngZone: NgZone;\n height: WritableSignal<number>;\n minDeltaPx?: number;\n}): () => void {\n const { element, ngZone, height, minDeltaPx = 1 } = options;\n\n if (typeof ResizeObserver === 'undefined') {\n height.set(element.clientHeight);\n return () => undefined;\n }\n\n let observer: ResizeObserver | null = null;\n\n ngZone.runOutsideAngular(() => {\n observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const nextHeight = entry.contentRect.height;\n if (Math.abs(nextHeight - height()) > minDeltaPx) {\n height.set(nextHeight);\n }\n }\n });\n observer.observe(element);\n });\n\n height.set(element.clientHeight);\n\n return () => {\n observer?.disconnect();\n observer = null;\n };\n}\n","import {\n afterNextRender,\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DragStateService } from '../services/drag-state.service';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport { DragPlaceholderComponent } from './drag-placeholder.component';\nimport {\n bindRafThrottledScrollTopSignal,\n bindResizeObserverHeightSignal,\n} from '../utils/dom-signal-bindings';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\n\n/**\n * Context provided to the item template.\n */\nexport interface VirtualScrollItemContext<T> {\n /** The item data */\n $implicit: T;\n /** The item's index in the original array */\n index: number;\n /** Whether this item is \"sticky\" (always rendered) */\n isSticky: boolean;\n}\n\n/**\n * A virtual scroll container that only renders visible items.\n *\n * Key features:\n * - Only renders items within the visible viewport plus an overscan buffer\n * - Supports \"sticky\" items that are always rendered (used for dragged items)\n * - Uses spacer divs to maintain correct scroll height\n * - Integrates with the drag-and-drop system\n * - Automatic height detection via ResizeObserver when containerHeight is not provided\n * - Supports dynamic item heights via `dynamicItemHeight` input\n *\n * @example\n * ```html\n * <!-- With fixed height items -->\n * <vdnd-virtual-scroll\n * [items]=\"items()\"\n * [itemHeight]=\"50\"\n * [containerHeight]=\"400\"\n * [trackByFn]=\"trackById\">\n * <ng-template let-item let-index=\"index\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-template>\n * </vdnd-virtual-scroll>\n *\n * <!-- With dynamic height items -->\n * <vdnd-virtual-scroll\n * [items]=\"items()\"\n * [itemHeight]=\"50\"\n * [dynamicItemHeight]=\"true\"\n * [containerHeight]=\"400\"\n * [trackByFn]=\"trackById\">\n * <ng-template let-item let-index=\"index\">\n * <div class=\"item\">{{ item.description }}</div>\n * </ng-template>\n * </vdnd-virtual-scroll>\n * ```\n */\n@Component({\n selector: 'vdnd-virtual-scroll',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, DragPlaceholderComponent],\n host: {\n class: 'vdnd-virtual-scroll',\n '[style.height.px]': 'containerHeight() ?? null',\n '[attr.data-item-height]': 'itemHeight()',\n '[attr.data-total-items]': 'items().length',\n },\n template: `\n <!-- Single spacer maintains scroll height -->\n <div class=\"vdnd-virtual-scroll-spacer\" [style.height.px]=\"totalHeight()\"></div>\n\n <!-- Content wrapper positioned via GPU-accelerated transform -->\n <div class=\"vdnd-virtual-scroll-content-wrapper\" [style.transform]=\"contentTransform()\">\n @for (entry of renderedItems(); track trackEntry($index, entry)) {\n @if (entry.type === 'placeholder') {\n <vdnd-drag-placeholder [itemHeight]=\"placeholderHeight()\" />\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate();\n context: {\n $implicit: entry.data,\n index: entry.index,\n isSticky: entry.isSticky,\n }\n \"\n >\n </ng-container>\n }\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n overflow: auto;\n position: relative;\n /* Disable browser scroll anchoring - this prevents scroll position from being\n adjusted when the DOM changes (e.g., when placeholder position updates).\n Without this, autoscroll UP would fight with browser's scroll restoration. */\n overflow-anchor: none;\n }\n\n .vdnd-virtual-scroll-spacer {\n /* Invisible spacer that maintains scroll height */\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n visibility: hidden;\n pointer-events: none;\n }\n\n .vdnd-virtual-scroll-content-wrapper {\n /* GPU-accelerated positioning */\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n will-change: transform;\n }\n `,\n})\nexport class VirtualScrollContainerComponent<T> implements OnInit, AfterViewInit, OnDestroy {\n readonly #dragState = inject(DragStateService);\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #autoScrollService = inject(AutoScrollService);\n readonly #dragIndexCalculator = inject(DragIndexCalculatorService);\n readonly #ngZone = inject(NgZone);\n readonly #injector = inject(Injector);\n\n /** Cleanup function for scroll listener */\n #scrollCleanup: (() => void) | null = null;\n #resizeCleanup: (() => void) | null = null;\n\n /** ResizeObserver for dynamic height measurement */\n #itemResizeObserver: ResizeObserver | null = null;\n\n /** Map from observed HTMLElement to its trackBy key */\n readonly #observedElements = new WeakMap<HTMLElement, unknown>();\n /** Stable mapping from rendered key to observed element for unobserve cleanup */\n readonly #observedElementByKey = new Map<unknown, HTMLElement>();\n\n /** Measured height from ResizeObserver (used when containerHeight is not provided) */\n readonly #measuredHeight = signal(0);\n\n /** Template for rendering each item - passed as input instead of content child for reliability */\n itemTemplate = input.required<TemplateRef<VirtualScrollItemContext<T>>>();\n\n /** Unique ID for this scroll container (used for auto-scroll registration) */\n scrollContainerId = input<string>();\n\n /** Whether auto-scroll is enabled when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n /** Array of items to render */\n items = input.required<T[]>();\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n /**\n * Height of the container in pixels.\n * If not provided, the container will automatically measure its height from CSS.\n * This allows you to set the height via CSS (e.g., flex, height: 100%, etc.)\n * and the component will adapt automatically, including on resize.\n */\n containerHeight = input<number>();\n\n /**\n * Effective height used for calculations.\n * Uses explicit containerHeight if provided, otherwise uses measured height.\n */\n readonly effectiveHeight = computed(() => this.containerHeight() ?? this.#measuredHeight());\n\n /** Number of items to render above/below the visible area */\n overscan = input<number>(3);\n\n /** IDs of items that should always be rendered (e.g., dragged items) */\n stickyItemIds = input<string[]>([]);\n\n /** Function to get a unique ID from an item */\n itemIdFn = input.required<(item: T) => string>();\n\n /**\n * Track-by function for the @for loop.\n * Optional - if not provided, will be derived from itemIdFn.\n */\n trackByFn = input<(index: number, item: T) => string | number>();\n\n /**\n * ID of the droppable this virtual scroll belongs to.\n * Required for placeholder positioning.\n */\n droppableId = input<string>();\n\n /**\n * Whether to automatically add the dragged item to the sticky list.\n * This ensures the dragged item remains visible during virtual scrolling.\n * @default true\n */\n autoStickyDraggedItem = input<boolean>(true);\n\n // ========== Strategy ==========\n\n /** The virtual scroll strategy, created based on dynamicItemHeight input */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n const height = this.itemHeight();\n return this.dynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n /**\n * Effective track-by function - uses provided trackByFn or derives from itemIdFn.\n */\n protected readonly effectiveTrackByFn = computed(() => {\n const userFn = this.trackByFn();\n if (userFn) return userFn;\n\n const idFn = this.itemIdFn();\n return (_index: number, item: T) => idFn(item);\n });\n\n /**\n * Track function for rendered entries (items + placeholder).\n */\n protected trackEntry(\n _index: number,\n entry: { type: 'item' | 'placeholder'; data: T | null; index: number },\n ): string | number {\n if (entry.type === 'placeholder') {\n return '__placeholder__';\n }\n const trackFn = this.effectiveTrackByFn();\n return trackFn(entry.index, entry.data as T);\n }\n\n /**\n * Effective sticky item IDs - combines user-provided IDs with auto-sticky dragged item.\n */\n protected readonly effectiveStickyIds = computed(() => {\n const userIds = this.stickyItemIds();\n\n if (!this.autoStickyDraggedItem()) {\n return userIds;\n }\n\n const draggedId = this.draggedItemId();\n if (!draggedId) {\n return userIds;\n }\n\n // Avoid creating new array if dragged ID is already in the list\n if (userIds.includes(draggedId)) {\n return userIds;\n }\n\n return [...userIds, draggedId];\n });\n\n /** Current scroll position */\n readonly #scrollTop = signal(0);\n\n /** Total height of all items (for scrollbar) */\n protected readonly totalHeight = computed(() => {\n const count = this.items().length;\n const strategy = this.#strategy();\n strategy.version();\n return strategy.getTotalHeight(count);\n });\n\n /** First visible item index */\n readonly #firstVisibleIndex = computed(() => {\n const strategy = this.#strategy();\n strategy.version();\n return strategy.getFirstVisibleIndex(this.#scrollTop());\n });\n\n /** Number of items visible in the viewport */\n readonly #visibleCount = computed(() => {\n const height = this.effectiveHeight();\n const strategy = this.#strategy();\n strategy.version();\n return strategy.getVisibleCount(this.#firstVisibleIndex(), height);\n });\n\n /** Range of items to render (with overscan) */\n readonly #renderRange = computed(() => {\n const first = this.#firstVisibleIndex();\n const visible = this.#visibleCount();\n const overscan = this.overscan();\n const total = this.items().length;\n\n const start = Math.max(0, first - overscan);\n const end = Math.min(total - 1, first + visible + overscan);\n\n return { start, end };\n });\n\n /** Transform offset for content wrapper (position of first rendered item) */\n protected readonly contentTransform = computed(() => {\n const { start } = this.#renderRange();\n const strategy = this.#strategy();\n strategy.version();\n\n const offset = strategy.getOffsetForIndex(start);\n return `translateY(${offset}px)`;\n });\n\n /** The ID of the currently dragged item (if any) */\n protected readonly draggedItemId = computed(() => {\n return this.#dragState.draggedItem()?.draggableId ?? null;\n });\n\n /** Map of item IDs to their indices - rebuilt only when items() changes (O(n) once, then O(1) lookups) */\n readonly #itemIndexMap = computed(() => {\n const items = this.items();\n const idFn = this.itemIdFn();\n const map = new Map<string, number>();\n for (let i = 0; i < items.length; i++) {\n map.set(idFn(items[i]), i);\n }\n return map;\n });\n\n /** The index of the currently dragged item in the items array (-1 if not found or not dragging) */\n readonly #draggedItemIndex = computed(() => {\n const draggedId = this.draggedItemId();\n if (!draggedId) return -1;\n return this.#itemIndexMap().get(draggedId) ?? -1;\n });\n\n /** Memoized Set of sticky IDs - rebuilt only when effectiveStickyIds() changes */\n readonly #stickyIdsSet = computed(() => new Set(this.effectiveStickyIds()));\n\n /** Whether the placeholder should be shown in this container */\n protected readonly shouldShowPlaceholder = computed(() => {\n if (!this.#dragState.isDragging()) return false;\n return this.#dragState.activeDroppableId() === this.droppableId();\n });\n\n /** The placeholder index when placeholder should be shown */\n protected readonly placeholderIndex = computed(() => {\n if (!this.shouldShowPlaceholder()) return -1;\n return this.#dragState.placeholderIndex() ?? -1;\n });\n\n /** Height for the placeholder — use dragged item's actual height in dynamic mode */\n protected readonly placeholderHeight = computed(() => {\n if (this.dynamicItemHeight()) {\n const draggedItemHeight = this.#dragState.draggedItem()?.height;\n if (draggedItemHeight && draggedItemHeight > 0) return draggedItemHeight;\n }\n return this.itemHeight();\n });\n\n /** Items to render, including sticky items and placeholder */\n protected readonly renderedItems = computed(() => {\n const items = this.items();\n const { start, end } = this.#renderRange();\n const stickyIds = this.#stickyIdsSet();\n const idFn = this.itemIdFn();\n const itemIndexMap = this.#itemIndexMap();\n const draggedId = this.draggedItemId();\n const placeholderIdx = this.placeholderIndex();\n\n const result: {\n type: 'item' | 'placeholder';\n data: T | null;\n index: number;\n isSticky: boolean;\n isDragging: boolean;\n }[] = [];\n const renderedIds = new Set<string>();\n let hasPlaceholder = false;\n\n // Add all items in the visible range, inserting placeholder at correct position\n for (let i = start; i <= end && i < items.length; i++) {\n // Insert placeholder before item at placeholderIndex\n if (placeholderIdx === i && !hasPlaceholder) {\n result.push({\n type: 'placeholder',\n data: null,\n index: placeholderIdx,\n isSticky: false,\n isDragging: false,\n });\n hasPlaceholder = true;\n }\n\n const item = items[i];\n const id = idFn(item);\n result.push({\n type: 'item',\n data: item,\n index: i,\n isSticky: stickyIds.has(id),\n isDragging: id === draggedId,\n });\n renderedIds.add(id);\n }\n\n // If placeholder is at the end (after all items), add it\n if (placeholderIdx >= items.length && placeholderIdx >= 0 && !hasPlaceholder) {\n result.push({\n type: 'placeholder',\n data: null,\n index: placeholderIdx,\n isSticky: false,\n isDragging: false,\n });\n hasPlaceholder = true;\n }\n\n // Add any sticky items that aren't already rendered\n const missingStickyIndices: { id: string; index: number }[] = [];\n for (const id of stickyIds) {\n if (renderedIds.has(id)) continue;\n const index = itemIndexMap.get(id);\n if (index === undefined) continue;\n missingStickyIndices.push({ id, index });\n }\n if (missingStickyIndices.length > 1) {\n missingStickyIndices.sort((a, b) => a.index - b.index);\n }\n\n for (const { id, index } of missingStickyIndices) {\n const item = items[index];\n if (item === undefined) continue;\n result.push({\n type: 'item',\n data: item,\n index,\n isSticky: true,\n isDragging: id === draggedId,\n });\n }\n\n return result;\n });\n\n /** Generated ID for auto-scroll registration */\n #generatedScrollId = `vdnd-scroll-${Math.random().toString(36).slice(2, 9)}`;\n\n /** Track previous dragged ID to detect drag end */\n #previousDraggedId: string | null = null;\n\n /** Track previous total height to detect if we were at bottom before drag ended */\n #previousTotalHeight = 0;\n\n constructor() {\n // Keep strategy item keys in sync\n effect(() => {\n const items = this.items();\n const idFn = this.itemIdFn();\n const keys = items.map((item) => idFn(item));\n this.#strategy().setItemKeys(keys);\n });\n\n // Register strategy with drag index calculator for accurate drag calculations\n effect((onCleanup) => {\n const droppableId = this.droppableId();\n const strategy = this.#strategy();\n if (droppableId) {\n this.#dragIndexCalculator.registerStrategy(droppableId, strategy);\n onCleanup(() => this.#dragIndexCalculator.unregisterStrategy(droppableId));\n }\n });\n\n // Set excluded index persistently during same-list drag.\n effect(() => {\n const strategy = this.#strategy();\n const draggedIndex = this.#draggedItemIndex();\n strategy.setExcludedIndex(draggedIndex >= 0 ? draggedIndex : null);\n });\n\n // Keyboard drag autoscroll: scroll to keep target index visible\n effect(() => {\n // Only apply when this droppable is active during keyboard drag\n if (!this.#dragState.isKeyboardDrag()) return;\n const activeDroppable = this.#dragState.activeDroppableId();\n if (activeDroppable !== this.droppableId()) return;\n\n const targetIndex = this.#dragState.keyboardTargetIndex();\n if (targetIndex === null) return;\n\n const strategy = this.#strategy();\n strategy.version();\n const height = this.effectiveHeight();\n if (height <= 0) return;\n\n const element = this.#elementRef.nativeElement;\n const currentScrollTop = element.scrollTop;\n\n // Calculate target item position using strategy\n const targetTop = strategy.getOffsetForIndex(targetIndex);\n const targetBottom = targetTop + strategy.getItemHeight(targetIndex);\n\n // Calculate visible range\n const viewportTop = currentScrollTop;\n const viewportBottom = currentScrollTop + height;\n\n // Check if target is fully visible\n if (targetTop < viewportTop) {\n // Target is above viewport - scroll up\n element.scrollTop = targetTop;\n this.#scrollTop.set(targetTop);\n } else if (targetBottom > viewportBottom) {\n // Target is below viewport - scroll down\n const newScrollTop = targetBottom - height;\n element.scrollTop = newScrollTop;\n this.#scrollTop.set(newScrollTop);\n }\n });\n\n // Preserve scroll position when drag ends at bottom of list.\n // Safety net: totalHeight no longer shrinks during drag (getTotalHeight\n // ignores exclusion), but this logic remains as harmless protection\n // in case future changes reintroduce height variance.\n effect(() => {\n const currentDraggedId = this.draggedItemId();\n const currentTotalHeight = this.totalHeight();\n const element = this.#elementRef.nativeElement;\n\n // Detect drag end (was dragging, now not)\n if (this.#previousDraggedId !== null && currentDraggedId === null) {\n const currentScrollTop = element.scrollTop;\n const strategy = this.#strategy();\n strategy.version();\n const height = this.effectiveHeight();\n const totalItems = this.items().length;\n\n // Calculate if we were at/near bottom (within 10px tolerance)\n // using the height FROM THE PREVIOUS CYCLE (when dragging was active)\n const dragReducedMaxScroll = Math.max(0, this.#previousTotalHeight - height);\n const wasAtBottom = currentScrollTop >= dragReducedMaxScroll - 10;\n\n if (wasAtBottom && dragReducedMaxScroll > 0) {\n // Clear exclusion before calculating new height\n strategy.setExcludedIndex(null);\n\n // Adjust scroll to new bottom position after totalHeight increases\n afterNextRender(\n () => {\n const newTotalHeight = strategy.getTotalHeight(totalItems);\n const newMaxScroll = Math.max(0, newTotalHeight - height);\n element.scrollTop = newMaxScroll;\n this.#scrollTop.set(newMaxScroll);\n },\n { injector: this.#injector },\n );\n }\n }\n\n this.#previousDraggedId = currentDraggedId;\n this.#previousTotalHeight = currentTotalHeight;\n });\n\n // Clamp scrollTop during drag if totalHeight ever shrinks.\n // With the current fix, getTotalHeight no longer excludes the dragged item,\n // so this is effectively a no-op. Kept as a safety net.\n effect(() => {\n const isDragging = this.#dragState.isDragging();\n const totalHeight = this.totalHeight();\n const element = this.#elementRef.nativeElement;\n\n if (isDragging) {\n const containerHeight = this.effectiveHeight();\n const maxScroll = Math.max(0, totalHeight - containerHeight);\n const currentScrollTop = element.scrollTop;\n\n // Clamp scrollTop to valid range\n if (currentScrollTop > maxScroll) {\n element.scrollTop = maxScroll;\n this.#scrollTop.set(maxScroll);\n }\n }\n });\n }\n\n ngOnInit(): void {\n // Register with auto-scroll service\n if (this.autoScrollEnabled()) {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.registerContainer(\n id,\n this.#elementRef.nativeElement,\n this.autoScrollConfig(),\n );\n }\n\n // Set up ResizeObserver for dynamic height measurement\n if (this.dynamicItemHeight()) {\n this.#setupItemResizeObserver();\n }\n }\n\n ngAfterViewInit(): void {\n const element = this.#elementRef.nativeElement;\n\n this.#resizeCleanup = bindResizeObserverHeightSignal({\n element,\n ngZone: this.#ngZone,\n height: this.#measuredHeight,\n minDeltaPx: 1,\n });\n\n // Scroll listener outside Angular zone with RAF throttling.\n // This avoids template event binding which would mark the component dirty 60x/sec.\n this.#scrollCleanup = bindRafThrottledScrollTopSignal({\n element,\n ngZone: this.#ngZone,\n scrollTop: this.#scrollTop,\n thresholdPx: 5,\n });\n\n // Observe rendered items for dynamic height measurement\n if (this.dynamicItemHeight()) {\n this.#observeRenderedItems();\n }\n }\n\n ngOnDestroy(): void {\n this.#scrollCleanup?.();\n this.#resizeCleanup?.();\n for (const element of this.#observedElementByKey.values()) {\n this.#itemResizeObserver?.unobserve(element);\n }\n this.#observedElementByKey.clear();\n this.#itemResizeObserver?.disconnect();\n\n // Unregister from auto-scroll service\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.unregisterContainer(id);\n }\n\n /**\n * Set up ResizeObserver for measuring individual item heights.\n */\n #setupItemResizeObserver(): void {\n this.#ngZone.runOutsideAngular(() => {\n this.#itemResizeObserver = new ResizeObserver((entries) => {\n const strategy = this.#strategy();\n for (const entry of entries) {\n const element = entry.target as HTMLElement;\n const key = this.#observedElements.get(element);\n if (key === undefined) continue;\n\n const height = entry.borderBoxSize?.[0]?.blockSize ?? element.offsetHeight;\n if (height > 0) {\n strategy.setMeasuredHeight(key, height);\n }\n }\n });\n });\n }\n\n /**\n * Observe currently rendered items' DOM elements for height changes.\n * Called after view init and on each render cycle in dynamic mode.\n */\n #observeRenderedItems(): void {\n if (!this.#itemResizeObserver) return;\n\n // Use an effect to re-observe whenever rendered items change\n effect(\n () => {\n const rendered = this.renderedItems();\n const idFn = this.itemIdFn();\n const observer = this.#itemResizeObserver;\n if (!observer) return;\n\n // Find the content wrapper and observe item elements\n const wrapper = this.#elementRef.nativeElement.querySelector(\n '.vdnd-virtual-scroll-content-wrapper',\n );\n if (!wrapper) return;\n\n const nextObservedByKey = new Map<unknown, HTMLElement>();\n\n for (const entry of rendered) {\n if (entry.type !== 'item' || !entry.data) continue;\n const key = idFn(entry.data);\n\n // Find the DOM element for this item by its data-draggable-id\n const el = wrapper.querySelector(`[data-draggable-id=\"${key}\"]`) as HTMLElement | null;\n if (el) {\n nextObservedByKey.set(key, el);\n }\n }\n\n for (const [key, oldElement] of this.#observedElementByKey) {\n const nextElement = nextObservedByKey.get(key);\n if (nextElement !== oldElement) {\n observer.unobserve(oldElement);\n }\n }\n\n for (const [key, nextElement] of nextObservedByKey) {\n const currentElement = this.#observedElementByKey.get(key);\n if (currentElement !== nextElement) {\n this.#observedElements.set(nextElement, key);\n observer.observe(nextElement);\n }\n }\n\n this.#observedElementByKey.clear();\n for (const [key, element] of nextObservedByKey) {\n this.#observedElementByKey.set(key, element);\n }\n },\n { injector: this.#injector },\n );\n }\n\n /**\n * Scroll to a specific position.\n */\n scrollTo(position: number): void {\n this.#elementRef.nativeElement.scrollTop = position;\n this.#scrollTop.set(position);\n }\n\n /**\n * Scroll to a specific item index.\n */\n scrollToIndex(index: number): void {\n const strategy = this.#strategy();\n const position = strategy.getOffsetForIndex(index);\n this.scrollTo(position);\n }\n\n /**\n * Get the current scroll position.\n */\n getScrollTop(): number {\n return this.#scrollTop();\n }\n\n /**\n * Get the total scrollable height.\n */\n getScrollHeight(): number {\n return this.totalHeight();\n }\n\n /**\n * Scroll by a delta amount.\n */\n scrollBy(delta: number): void {\n const newPosition = Math.max(\n 0,\n Math.min(this.getScrollTop() + delta, this.getScrollHeight() - this.effectiveHeight()),\n );\n this.scrollTo(newPosition);\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DragStateService } from '../services/drag-state.service';\nimport { OverlayContainerService } from '../services/overlay-container.service';\n\n/**\n * Context provided to the drag preview template.\n */\nexport interface DragPreviewContext<T = unknown> {\n /** The data associated with the dragged item */\n $implicit: T;\n /** The draggable ID */\n draggableId: string;\n /** The source droppable ID */\n droppableId: string;\n}\n\n/**\n * Renders a preview of the dragged item that follows the cursor.\n *\n * The component automatically teleports itself into a body-level overlay container,\n * so it works correctly even inside ancestors with CSS `transform` (e.g. Ionic pages).\n * It can be placed anywhere in the component tree.\n *\n * @example\n * ```html\n * <vdnd-drag-preview>\n * <ng-template let-data let-id=\"draggableId\">\n * <div class=\"drag-preview\">{{ data.name }}</div>\n * </ng-template>\n * </vdnd-drag-preview>\n * ```\n */\n@Component({\n selector: 'vdnd-drag-preview',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `\n @if (isVisible()) {\n <div\n class=\"vdnd-drag-preview\"\n data-testid=\"vdnd-drag-preview\"\n [style.transform]=\"transform()\"\n [style.width.px]=\"dimensions().width\"\n [style.height.px]=\"dimensions().height\"\n >\n @if (previewTemplate()) {\n <ng-container *ngTemplateOutlet=\"previewTemplate()!; context: templateContext()\">\n </ng-container>\n } @else if (clonedElement()) {\n <div class=\"vdnd-drag-preview-clone\" #cloneContainer></div>\n } @else {\n <div class=\"vdnd-drag-preview-default\">\n {{ dragState.draggedItem()?.draggableId }}\n </div>\n }\n </div>\n }\n `,\n styles: `\n .vdnd-drag-preview {\n box-sizing: border-box;\n position: fixed;\n left: 0;\n top: 0;\n will-change: transform;\n pointer-events: none;\n z-index: 1000;\n }\n\n .vdnd-drag-preview-clone {\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n `,\n})\nexport class DragPreviewComponent<T = unknown> implements OnDestroy {\n protected readonly dragState = inject(DragStateService);\n readonly #overlayContainer = inject(OverlayContainerService);\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n\n /** Optional custom template for the preview */\n previewTemplate = input<TemplateRef<DragPreviewContext<T>>>();\n\n /** Offset from cursor to preview (to avoid cursor being on top of preview) */\n cursorOffset = input<{ x: number; y: number }>({ x: 8, y: 8 });\n\n /** Reference to the clone container element (cannot use ES private with viewChild) */\n private readonly cloneContainer = viewChild<ElementRef<HTMLElement>>('cloneContainer');\n\n /** The cloned element from drag state (used when no custom template is provided) */\n protected readonly clonedElement = computed(() => {\n if (this.previewTemplate()) {\n return null; // Custom template takes precedence\n }\n return this.dragState.draggedItem()?.clonedElement ?? null;\n });\n\n constructor() {\n // Teleport host element into the body-level overlay container after first render.\n // This escapes any ancestor CSS transforms that would break position: fixed.\n afterNextRender(() => {\n const container = this.#overlayContainer.getContainerElement();\n if (container) {\n container.appendChild(this.#elementRef.nativeElement);\n }\n });\n\n // Effect to insert the cloned element into the container\n effect(() => {\n const container = this.cloneContainer()?.nativeElement;\n const clone = this.clonedElement();\n\n if (!container) {\n return;\n }\n\n // Clear previous content and append the prepared clone element.\n // Avoid cloning again: ElementCloneService already creates a styled/sanitized clone.\n container.innerHTML = '';\n if (clone) {\n container.appendChild(clone);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.#elementRef.nativeElement.remove();\n }\n\n /** Whether the preview is visible */\n protected readonly isVisible = computed(() => {\n return this.dragState.isDragging() && this.dragState.cursorPosition() !== null;\n });\n\n /** Position of the preview */\n protected readonly position = computed(() => {\n const cursor = this.dragState.cursorPosition();\n const grabOffset = this.dragState.grabOffset();\n const fallbackOffset = this.cursorOffset();\n const initialPosition = this.dragState.initialPosition();\n const lockAxis = this.dragState.lockAxis();\n\n if (!cursor) {\n return { x: 0, y: 0 };\n }\n\n // Use grab offset if available (preserves grab position), otherwise fall back to cursorOffset input\n const offset = grabOffset ?? fallbackOffset;\n\n let x = cursor.x - offset.x;\n let y = cursor.y - offset.y;\n\n // Apply axis locking if configured\n if (lockAxis && initialPosition) {\n if (lockAxis === 'x') {\n // Lock X axis: x stays at initial position\n x = initialPosition.x - offset.x;\n } else if (lockAxis === 'y') {\n // Lock Y axis: y stays at initial position\n y = initialPosition.y - offset.y;\n }\n }\n\n return { x, y };\n });\n\n /** Transform-based positioning for better performance (avoid layout from left/top). */\n protected readonly transform = computed(() => {\n const { x, y } = this.position();\n return `translate3d(${x}px, ${y}px, 0)`;\n });\n\n /** Dimensions of the preview */\n protected readonly dimensions = computed(() => {\n const item = this.dragState.draggedItem();\n\n if (!item) {\n return { width: 100, height: 50 };\n }\n\n return {\n width: item.width,\n height: item.height,\n };\n });\n\n /** Template context */\n protected readonly templateContext = computed((): DragPreviewContext<T> => {\n const item = this.dragState.draggedItem();\n\n return {\n $implicit: (item?.data ?? null) as T,\n draggableId: item?.draggableId ?? '',\n droppableId: item?.droppableId ?? '',\n };\n });\n}\n","import { ChangeDetectionStrategy, Component, input, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * Context provided to the custom placeholder template.\n */\nexport interface PlaceholderContext {\n /** The height of the placeholder in pixels */\n $implicit: number;\n /** The height of the placeholder in pixels (explicit property) */\n height: number;\n}\n\n/**\n * A placeholder component that indicates where a dropped item will be inserted.\n *\n * By default, renders as empty/transparent space. Pass a custom template\n * to customize the placeholder appearance.\n *\n * @example\n * ```html\n * <!-- Default: transparent/empty space -->\n * <vdnd-placeholder [height]=\"50\"></vdnd-placeholder>\n *\n * <!-- Custom template with dashed border -->\n * <vdnd-placeholder [height]=\"50\" [template]=\"customPlaceholder\">\n * <ng-template #customPlaceholder let-height>\n * <div class=\"my-placeholder\" [style.height.px]=\"height\">\n * Drop here\n * </div>\n * </ng-template>\n * </vdnd-placeholder>\n * ```\n */\n@Component({\n selector: 'vdnd-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n class: 'vdnd-placeholder',\n '[style.height.px]': 'height()',\n '[attr.data-draggable-id]': '\"placeholder\"',\n },\n template: `\n @if (template()) {\n <ng-container\n *ngTemplateOutlet=\"template()!; context: { $implicit: height(), height: height() }\"\n >\n </ng-container>\n }\n `,\n styles: `\n :host {\n display: block;\n box-sizing: border-box;\n }\n `,\n})\nexport class PlaceholderComponent {\n /** Height of the placeholder in pixels */\n height = input<number>(50);\n\n /** Optional custom template for the placeholder content */\n template = input<TemplateRef<PlaceholderContext>>();\n}\n","import { Directive, InjectionToken, input, Signal } from '@angular/core';\n\n/**\n * Token for injecting the group context from a parent directive.\n * Allows child draggables and droppables to inherit the group name automatically.\n */\nexport const VDND_GROUP_TOKEN = new InjectionToken<VdndGroupContext>('VDND_GROUP_TOKEN');\n\n/**\n * Context provided by the group directive to its children.\n */\nexport interface VdndGroupContext {\n /** The group name signal */\n readonly group: Signal<string>;\n}\n\n/**\n * Provides a group context to child draggable and droppable directives.\n * When applied to a parent element, child directives can inherit the group name\n * automatically without needing to specify it on each element.\n *\n * @example\n * ```html\n * <!-- Without group directive (verbose) -->\n * <div vdndDroppable=\"list-1\" vdndDroppableGroup=\"my-group\">\n * <div vdndDraggable=\"item-1\" vdndDraggableGroup=\"my-group\">Item 1</div>\n * <div vdndDraggable=\"item-2\" vdndDraggableGroup=\"my-group\">Item 2</div>\n * </div>\n *\n * <!-- With group directive (concise) -->\n * <div vdndGroup=\"my-group\">\n * <div vdndDroppable=\"list-1\">\n * <div vdndDraggable=\"item-1\">Item 1</div>\n * <div vdndDraggable=\"item-2\">Item 2</div>\n * </div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndGroup]',\n providers: [\n {\n provide: VDND_GROUP_TOKEN,\n useExisting: DroppableGroupDirective,\n },\n ],\n})\nexport class DroppableGroupDirective implements VdndGroupContext {\n /** The group name that will be inherited by child directives */\n readonly group = input.required<string>({ alias: 'vdndGroup' });\n}\n","import { computed, isDevMode, type Signal } from '@angular/core';\nimport type { VdndGroupContext } from '../directives/droppable-group.directive';\n\n/**\n * Configuration options for creating an effective group signal.\n */\nexport interface GroupResolutionOptions {\n /** The explicit group input signal */\n explicitGroup: Signal<string | undefined>;\n /** The parent group context injected via VDND_GROUP_TOKEN (may be null) */\n parentGroup: VdndGroupContext | null;\n /** The element ID signal for warning messages */\n elementId: Signal<string>;\n /** The type of element ('draggable' or 'droppable') for warning messages */\n elementType: 'draggable' | 'droppable';\n}\n\n/**\n * State tracker for group resolution to avoid repeated warnings.\n */\ninterface GroupResolutionState {\n hasWarnedMissingGroup: boolean;\n}\n\n/**\n * Creates a computed signal that resolves the effective group name for a draggable or droppable.\n *\n * Resolution order:\n * 1. Explicit group input (vdndDraggableGroup or vdndDroppableGroup)\n * 2. Inherited group from parent vdndGroup directive\n * 3. null (with dev-mode warning)\n *\n * @example\n * ```typescript\n * readonly #effectiveGroup = createEffectiveGroupSignal({\n * explicitGroup: this.vdndDraggableGroup,\n * parentGroup: this.#parentGroup,\n * elementId: this.vdndDraggable,\n * elementType: 'draggable',\n * });\n * ```\n */\nexport function createEffectiveGroupSignal(options: GroupResolutionOptions): Signal<string | null> {\n const { explicitGroup, parentGroup, elementId, elementType } = options;\n\n // State object to track whether we've warned (mutable closure state)\n const state: GroupResolutionState = { hasWarnedMissingGroup: false };\n\n return computed((): string | null => {\n const explicit = explicitGroup();\n if (explicit) return explicit;\n\n const inherited = parentGroup?.group();\n if (inherited) return inherited;\n\n if (isDevMode() && !state.hasWarnedMissingGroup) {\n const directive = elementType === 'draggable' ? 'vdndDraggable' : 'vdndDroppable';\n const groupInput = elementType === 'draggable' ? 'vdndDraggableGroup' : 'vdndDroppableGroup';\n const action = elementType === 'draggable' ? 'Drag' : 'Dropping';\n\n console.warn(\n `[ngx-virtual-dnd] [${directive}=\"${elementId()}\"] requires a group. ` +\n `Either set ${groupInput} or wrap in a vdndGroup directive. ` +\n `${action} will be disabled for this element.`,\n );\n state.hasWarnedMissingGroup = true;\n }\n\n return null;\n });\n}\n","import {\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n} from '@angular/core';\nimport { DragStateService } from '../services/drag-state.service';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport { DragState, DropEvent, END_OF_LIST } from '../models/drag-drop.models';\nimport { VDND_GROUP_TOKEN } from './droppable-group.directive';\nimport { createEffectiveGroupSignal } from '../utils/group-resolution';\n\n/**\n * Marks an element as a valid drop target within the virtual scroll drag-and-drop system.\n *\n * @example\n * ```html\n * <!-- With explicit group -->\n * <div\n * vdndDroppable=\"list-1\"\n * vdndDroppableGroup=\"my-group\"\n * (drop)=\"onDrop($event)\">\n * <!-- Draggable items here -->\n * </div>\n *\n * <!-- With inherited group from parent vdndGroup directive -->\n * <div vdndGroup=\"my-group\">\n * <div vdndDroppable=\"list-1\" (drop)=\"onDrop($event)\">\n * <!-- Draggable items here -->\n * </div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndDroppable]',\n host: {\n '[attr.data-droppable-id]': 'vdndDroppable()',\n '[attr.data-droppable-group]': 'effectiveGroup()',\n '[attr.data-constrain-to-container]': 'constrainToContainer() || null',\n '[attr.aria-dropeffect]': '\"move\"',\n '[class.vdnd-droppable]': 'true',\n '[class.vdnd-droppable-active]': 'isActive()',\n '[class.vdnd-droppable-disabled]': 'disabled()',\n },\n})\nexport class DroppableDirective implements OnInit, OnDestroy {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #dragState = inject(DragStateService);\n readonly #autoScroll = inject(AutoScrollService);\n readonly #parentGroup = inject(VDND_GROUP_TOKEN, { optional: true });\n\n /** Unique identifier for this droppable */\n vdndDroppable = input.required<string>();\n\n /**\n * Drag-and-drop group name.\n * Optional when a parent `vdndGroup` directive provides the group context.\n */\n vdndDroppableGroup = input<string>();\n\n /**\n * Resolved group name - uses explicit input or falls back to parent group.\n * Returns null (and disables dropping) if neither is available.\n */\n readonly effectiveGroup = createEffectiveGroupSignal({\n explicitGroup: this.vdndDroppableGroup,\n parentGroup: this.#parentGroup,\n elementId: this.vdndDroppable,\n elementType: 'droppable',\n });\n\n /** Optional data associated with this droppable */\n vdndDroppableData = input<unknown>();\n\n /** Whether this droppable is disabled */\n disabled = input<boolean>(false);\n\n /** Enable auto-scroll when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n /** Constrain drag preview and placeholder to container boundaries */\n constrainToContainer = input<boolean>(false);\n\n /** Emits when an item is dropped on this droppable */\n // eslint-disable-next-line @angular-eslint/no-output-native\n drop = output<DropEvent>();\n\n /** Whether this droppable is currently being targeted */\n readonly isActive = computed(() => {\n const activeId = this.#dragState.activeDroppableId();\n return activeId === this.vdndDroppable() && !this.disabled();\n });\n\n /** The current placeholder ID when this droppable is active */\n readonly placeholderId = computed(() => {\n if (!this.isActive()) {\n return null;\n }\n return this.#dragState.placeholderId();\n });\n\n /** Track previous active state for cache clearing on leave */\n #wasActive = false;\n\n /** Cached state for handling drop (since state is cleared before effect fires) */\n #cachedDragState: DragState | null = null;\n\n ngOnInit(): void {\n // Without a group, this droppable can't participate in DnD (fail gracefully).\n if (!this.effectiveGroup()) {\n return;\n }\n\n // Register with auto-scroll service only if this element is actually scrollable\n // (i.e., has overflow: auto/scroll and content taller than container)\n if (this.autoScrollEnabled() && this.#isScrollable()) {\n this.#autoScroll.registerContainer(\n this.vdndDroppable(),\n this.#elementRef.nativeElement,\n this.autoScrollConfig(),\n );\n }\n }\n\n /**\n * Check if this element is actually scrollable.\n */\n #isScrollable(): boolean {\n const el = this.#elementRef.nativeElement;\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n const overflowX = style.overflowX;\n\n // Check if overflow allows scrolling\n const hasScrollableOverflow =\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowX === 'auto' ||\n overflowX === 'scroll';\n\n if (!hasScrollableOverflow) {\n return false;\n }\n\n // Check if content is larger than container\n return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;\n }\n\n constructor() {\n // React to state changes and handle drop events\n effect(() => {\n const active = this.isActive();\n const draggedItem = this.#dragState.draggedItem();\n const isDragging = this.#dragState.isDragging();\n\n // Cache state while active for use during drop handling\n if (active && isDragging && draggedItem) {\n this.#cachedDragState = this.#dragState.getStateSnapshot();\n }\n\n // Handle drag end (drop)\n if (!isDragging && this.#wasActive && draggedItem === null) {\n // Check if drag was cancelled (e.g., Escape key)\n if (!this.#dragState.wasCancelled()) {\n // Drag ended normally - this is a drop\n this.#handleDrop();\n }\n this.#cachedDragState = null;\n }\n\n // Clear cached state when leaving without dropping\n if (!active && this.#wasActive && isDragging) {\n this.#cachedDragState = null;\n }\n\n this.#wasActive = active;\n });\n }\n\n ngOnDestroy(): void {\n // Clean up if this droppable is destroyed while being active\n if (this.isActive()) {\n this.#dragState.setActiveDroppable(null);\n }\n\n // Unregister from auto-scroll\n this.#autoScroll.unregisterContainer(this.vdndDroppable());\n }\n\n /**\n * Handle a drop on this droppable.\n */\n #handleDrop(): void {\n // Use cached state since the actual state is cleared before this effect fires\n const state = this.#cachedDragState;\n\n if (!state?.draggedItem || state.activeDroppableId !== this.vdndDroppable()) {\n return;\n }\n\n const sourceDroppableId = state.sourceDroppableId ?? '';\n const placeholderId = state.placeholderId ?? END_OF_LIST;\n\n // Use the stored source index from drag state\n // This is critical for virtual scrolling where the original element may no longer\n // be in the DOM after autoscroll (it gets virtualized out of view)\n const sourceIndex =\n state.sourceIndex ?? this.#getItemIndex(state.draggedItem.draggableId, sourceDroppableId);\n\n // Use the pre-calculated placeholderIndex if available (more reliable)\n // Fall back to DOM-based calculation if not\n let destinationIndex =\n state.placeholderIndex !== null && state.placeholderIndex !== undefined\n ? state.placeholderIndex\n : this.#getDestinationIndex(placeholderId);\n\n // Adjust for same-list reordering: if moving within the same list and\n // the destination is after the source, we need to account for the item\n // being removed from its original position\n if (sourceDroppableId === this.vdndDroppable() && sourceIndex < destinationIndex) {\n destinationIndex--;\n }\n\n this.drop.emit({\n source: {\n draggableId: state.draggedItem.draggableId,\n droppableId: sourceDroppableId,\n index: sourceIndex,\n data: state.draggedItem.data,\n },\n destination: {\n droppableId: this.vdndDroppable(),\n placeholderId,\n index: destinationIndex,\n data: this.vdndDroppableData(),\n },\n });\n }\n\n /**\n * Get the index of an item in a droppable.\n * This is a simplified implementation - in practice, the consumer would track this.\n */\n #getItemIndex(draggableId: string, droppableId: string): number {\n // Find all draggables in the source droppable\n const droppable = document.querySelector(`[data-droppable-id=\"${droppableId}\"]`);\n if (!droppable) {\n return 0;\n }\n\n const draggables = droppable.querySelectorAll('[data-draggable-id]');\n for (let i = 0; i < draggables.length; i++) {\n if (draggables[i].getAttribute('data-draggable-id') === draggableId) {\n return i;\n }\n }\n\n return 0;\n }\n\n /**\n * Get the destination index based on the placeholder.\n */\n #getDestinationIndex(placeholderId: string): number {\n // Exclude placeholder elements from the count\n const draggables = this.#elementRef.nativeElement.querySelectorAll(\n '[data-draggable-id]:not([data-draggable-id=\"placeholder\"])',\n );\n\n if (placeholderId === END_OF_LIST) {\n return draggables.length;\n }\n\n // Find the index of the placeholder item\n for (let i = 0; i < draggables.length; i++) {\n if (draggables[i].getAttribute('data-draggable-id') === placeholderId) {\n return i;\n }\n }\n\n return 0;\n }\n\n /**\n * Get the element reference (for external use).\n */\n getElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Manually scroll this droppable.\n */\n scrollBy(delta: number): void {\n this.#elementRef.nativeElement.scrollTop += delta;\n }\n\n /**\n * Get the current scroll position.\n */\n getScrollTop(): number {\n return this.#elementRef.nativeElement.scrollTop;\n }\n\n /**\n * Get the scroll height.\n */\n getScrollHeight(): number {\n return this.#elementRef.nativeElement.scrollHeight;\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output, TemplateRef } from '@angular/core';\nimport {\n VirtualScrollContainerComponent,\n VirtualScrollItemContext,\n} from './virtual-scroll-container.component';\nimport { DroppableDirective } from '../directives/droppable.directive';\nimport { AutoScrollConfig } from '../services/auto-scroll.service';\nimport { DropEvent } from '../models/drag-drop.models';\n\n/**\n * A high-level component that combines droppable, virtual scroll, and placeholder\n * functionality into a single, easy-to-use component.\n *\n * This component significantly reduces boilerplate by automatically handling:\n * - Placeholder insertion at the correct position\n * - Sticky item management for the dragged item\n * - Virtual scrolling with proper drag-and-drop integration\n * - Droppable container setup\n *\n * @example\n * ```html\n * <!-- Before (verbose): ~45 lines of boilerplate -->\n * <div vdndDroppable=\"list-1\" vdndDroppableGroup=\"demo\" (drop)=\"onDrop($event)\">\n * <vdnd-virtual-scroll\n * [items]=\"itemsWithPlaceholder()\"\n * [itemHeight]=\"50\"\n * [stickyItemIds]=\"stickyIds()\"\n * [itemIdFn]=\"getItemId\"\n * [trackByFn]=\"trackById\"\n * [itemTemplate]=\"itemTpl\">\n * </vdnd-virtual-scroll>\n * </div>\n *\n * <!-- After (concise): ~8 lines -->\n * <div vdndGroup=\"demo\">\n * <vdnd-sortable-list\n * droppableId=\"list-1\"\n * [items]=\"list()\"\n * [itemHeight]=\"50\"\n * [itemIdFn]=\"getItemId\"\n * [itemTemplate]=\"itemTpl\"\n * (drop)=\"onDrop($event)\">\n * </vdnd-sortable-list>\n * </div>\n * ```\n */\n@Component({\n selector: 'vdnd-sortable-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [VirtualScrollContainerComponent, DroppableDirective],\n host: {\n class: 'vdnd-sortable-list',\n },\n template: `\n <div\n class=\"vdnd-sortable-list-droppable\"\n [vdndDroppable]=\"droppableId()\"\n [vdndDroppableGroup]=\"group()\"\n [vdndDroppableData]=\"droppableData()\"\n [disabled]=\"disabled()\"\n [constrainToContainer]=\"constrainToContainer()\"\n (drop)=\"drop.emit($event)\"\n >\n <vdnd-virtual-scroll\n [items]=\"items()\"\n [itemHeight]=\"itemHeight()\"\n [dynamicItemHeight]=\"dynamicItemHeight()\"\n [itemIdFn]=\"itemIdFn()\"\n [trackByFn]=\"trackByFn()\"\n [itemTemplate]=\"itemTemplate()\"\n [droppableId]=\"droppableId()\"\n [autoStickyDraggedItem]=\"true\"\n [containerHeight]=\"containerHeight()\"\n [overscan]=\"overscan()\"\n [autoScrollEnabled]=\"autoScrollEnabled()\"\n [autoScrollConfig]=\"autoScrollConfig()\"\n >\n </vdnd-virtual-scroll>\n </div>\n `,\n styles: `\n :host {\n display: block;\n }\n `,\n})\nexport class VirtualSortableListComponent<T> {\n // ========== Required Inputs ==========\n\n /** Unique identifier for this droppable list */\n droppableId = input.required<string>();\n\n /**\n * Drag-and-drop group name.\n * Optional when a parent `vdndGroup` directive provides the group context.\n */\n group = input<string>();\n\n /** Array of items to render */\n items = input.required<T[]>();\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n /** Function to get a unique ID from an item */\n itemIdFn = input.required<(item: T) => string>();\n\n /** Template for rendering each item */\n itemTemplate = input.required<TemplateRef<VirtualScrollItemContext<T>>>();\n\n // ========== Optional Inputs ==========\n\n /**\n * Track-by function for the @for loop.\n * Optional - if not provided, will be derived from itemIdFn.\n */\n trackByFn = input<(index: number, item: T) => string | number>();\n\n /** Optional data associated with this droppable */\n droppableData = input<unknown>();\n\n /** Whether this sortable list is disabled */\n disabled = input<boolean>(false);\n\n /**\n * Height of the container in pixels.\n * If not provided, uses CSS-based height detection.\n */\n containerHeight = input<number>();\n\n /** Number of items to render above/below the visible area */\n overscan = input<number>(3);\n\n /** Enable auto-scroll when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n /** Constrain drag preview and placeholder to container boundaries */\n constrainToContainer = input<boolean>(false);\n\n // ========== Outputs ==========\n\n /** Emits when an item is dropped on this list */\n // eslint-disable-next-line @angular-eslint/no-output-native\n drop = output<DropEvent>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n} from '@angular/core';\nimport { VDND_VIRTUAL_VIEWPORT, VdndVirtualViewport } from '../tokens/virtual-viewport.token';\nimport { VDND_SCROLL_CONTAINER, VdndScrollContainer } from '../tokens/scroll-container.token';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport {\n bindRafThrottledScrollTopSignal,\n bindResizeObserverHeightSignal,\n} from '../utils/dom-signal-bindings';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\n\n/**\n * A virtual viewport component that provides efficient wrapper-based positioning\n * for virtual scrolling. This component acts as the scroll container and provides\n * a content wrapper with GPU-accelerated transform positioning.\n *\n * Use this component when you need virtual scrolling with optimal performance.\n * Items rendered inside via `*vdndVirtualFor` will be positioned using a single\n * transform on the wrapper, rather than individual absolute positioning.\n *\n * @example\n * Basic usage:\n * ```html\n * <vdnd-virtual-viewport [itemHeight]=\"50\" style=\"height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-viewport>\n * ```\n *\n * @example\n * With dynamic item heights:\n * ```html\n * <vdnd-virtual-viewport\n * [itemHeight]=\"50\"\n * [dynamicItemHeight]=\"true\"\n * style=\"height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-viewport>\n * ```\n */\n@Component({\n selector: 'vdnd-virtual-viewport',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: VDND_VIRTUAL_VIEWPORT, useExisting: VirtualViewportComponent },\n { provide: VDND_SCROLL_CONTAINER, useExisting: VirtualViewportComponent },\n ],\n host: {\n class: 'vdnd-virtual-viewport',\n },\n styles: `\n :host {\n display: block;\n overflow: auto;\n position: relative;\n /* Disable browser scroll anchoring to prevent scroll position adjustments\n when DOM changes (e.g., placeholder position updates during drag) */\n overflow-anchor: none;\n }\n\n .vdnd-viewport-spacer {\n position: absolute;\n left: 0;\n width: 1px;\n visibility: hidden;\n pointer-events: none;\n }\n\n .vdnd-viewport-content {\n position: absolute;\n left: 0;\n right: 0;\n will-change: transform;\n }\n `,\n template: `\n <!-- Spacer maintains total scroll height -->\n <div\n class=\"vdnd-viewport-spacer\"\n [style.top.px]=\"contentOffset()\"\n [style.height.px]=\"totalHeight()\"\n ></div>\n\n <!-- Content wrapper with GPU-accelerated transform -->\n <div\n class=\"vdnd-viewport-content\"\n [style.top.px]=\"contentOffset()\"\n [style.transform]=\"contentTransform()\"\n >\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class VirtualViewportComponent\n implements VdndVirtualViewport, VdndScrollContainer, OnInit, OnDestroy\n{\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #ngZone = inject(NgZone);\n readonly #autoScrollService = inject(AutoScrollService);\n\n /** Current scroll position (reactive) */\n readonly #scrollTop = signal(0);\n\n /** Measured container height (reactive) */\n readonly #containerHeight = signal(0);\n\n /** Cleanup function for scroll listener */\n #scrollCleanup: (() => void) | null = null;\n #resizeCleanup: (() => void) | null = null;\n\n /** Generated ID for auto-scroll registration */\n #generatedScrollId = `vdnd-viewport-${Math.random().toString(36).slice(2, 9)}`;\n\n /**\n * The actual first rendered item index, set by VirtualForDirective.\n * This accounts for overscan and is used for wrapper positioning.\n */\n readonly #renderStartIndex = signal(0);\n\n // ========== Inputs ==========\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n /** Offset for content below headers (in pixels) */\n contentOffset = input<number>(0);\n\n /** Unique ID for this scroll container (used for auto-scroll registration) */\n scrollContainerId = input<string>();\n\n /** Whether auto-scroll is enabled when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n // ========== Strategy ==========\n\n /** The virtual scroll strategy, created based on dynamicItemHeight input */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n const height = this.itemHeight();\n return this.dynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n get strategy(): VirtualScrollStrategy {\n return this.#strategy();\n }\n\n // ========== Computed Values ==========\n\n /** Total height of all items (for scroll height), derived from strategy item count */\n readonly totalHeight = computed(() => {\n const s = this.#strategy();\n s.version();\n return s.getTotalHeight(s.getItemCount());\n });\n\n /** Transform for content wrapper positioning */\n readonly contentTransform = computed(() => {\n const startIndex = this.#renderStartIndex();\n const s = this.#strategy();\n const offset = s.getOffsetForIndex(startIndex);\n return `translateY(${offset}px)`;\n });\n\n // ========== VdndVirtualViewport Implementation ==========\n\n scrollTop(): number {\n return this.#scrollTop();\n }\n\n containerHeight(): number {\n return this.#containerHeight();\n }\n\n get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Called by VirtualForDirective to inform this viewport of the actual\n * first rendered item index. Used for wrapper positioning.\n */\n setRenderStartIndex(index: number): void {\n this.#renderStartIndex.set(index);\n }\n\n getOffsetForIndex(index: number): number {\n return this.#strategy().getOffsetForIndex(index);\n }\n\n // ========== VdndScrollContainer Implementation ==========\n\n scrollTo(options: ScrollToOptions): void {\n this.nativeElement.scrollTo(options);\n }\n\n scrollBy(delta: number): void {\n const newPosition = Math.max(\n 0,\n Math.min(\n this.scrollTop() + delta,\n this.nativeElement.scrollHeight - this.nativeElement.clientHeight,\n ),\n );\n this.scrollTo({ top: newPosition });\n }\n\n // ========== Lifecycle ==========\n\n ngOnInit(): void {\n this.#setupScrollListener();\n this.#setupResizeObserver();\n this.#registerAutoScroll();\n }\n\n ngOnDestroy(): void {\n this.#scrollCleanup?.();\n this.#resizeCleanup?.();\n this.#unregisterAutoScroll();\n }\n\n // ========== Private Methods ==========\n\n /** Minimum scroll delta (px) to trigger signal update */\n readonly #scrollThreshold = 5;\n\n #setupScrollListener(): void {\n this.#scrollCleanup = bindRafThrottledScrollTopSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n scrollTop: this.#scrollTop,\n thresholdPx: this.#scrollThreshold,\n });\n }\n\n #setupResizeObserver(): void {\n this.#resizeCleanup = bindResizeObserverHeightSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n height: this.#containerHeight,\n minDeltaPx: 1,\n });\n }\n\n #registerAutoScroll(): void {\n if (this.autoScrollEnabled()) {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.registerContainer(id, this.nativeElement, this.autoScrollConfig());\n }\n }\n\n #unregisterAutoScroll(): void {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.unregisterContainer(id);\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n/**\n * Marks an element as the header content for a `vdnd-virtual-content` component.\n *\n * Place this directive on a projected element inside `<vdnd-virtual-content>`.\n * The component will automatically measure the header's height via ResizeObserver\n * and use it as the content offset for virtual scroll calculations.\n *\n * This eliminates the need for manual ResizeObserver boilerplate that was\n * previously required with the `[contentOffset]` input.\n *\n * @example\n * ```html\n * <vdnd-virtual-content [itemHeight]=\"50\">\n * <div class=\"page-header\" vdndContentHeader>\n * <h1>My List</h1>\n * </div>\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-content>\n * ```\n */\n@Directive({\n selector: '[vdndContentHeader]',\n})\nexport class ContentHeaderDirective {\n readonly elementRef = inject(ElementRef<HTMLElement>);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n signal,\n} from '@angular/core';\nimport { VDND_VIRTUAL_VIEWPORT, VdndVirtualViewport } from '../tokens/virtual-viewport.token';\nimport { VDND_SCROLL_CONTAINER, VdndScrollContainer } from '../tokens/scroll-container.token';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\nimport { ContentHeaderDirective } from '../directives/content-header.directive';\n\n/**\n * A virtual content component that provides wrapper-based positioning\n * for virtual scrolling within an EXTERNAL scroll container.\n *\n * Use this component when you need virtual scrolling alongside other content\n * (headers, footers) within a shared scroll container. The component provides\n * a content wrapper with GPU-accelerated transform positioning while delegating\n * scroll handling to the parent `vdndScrollable` container.\n *\n * Headers marked with `vdndContentHeader` are automatically measured via\n * ResizeObserver — no manual offset calculation needed.\n *\n * @example\n * Content projection with auto-measured header:\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 100vh;\">\n * <vdnd-virtual-content [itemHeight]=\"50\">\n * <div class=\"header\" vdndContentHeader>Welcome!</div>\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-content>\n * </div>\n * ```\n *\n * @example\n * Manual offset (escape hatch):\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 100vh;\">\n * <div class=\"header\" #header>Welcome!</div>\n * <vdnd-virtual-content [itemHeight]=\"50\" [contentOffset]=\"header.offsetHeight\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-content>\n * </div>\n * ```\n */\n@Component({\n selector: 'vdnd-virtual-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: VDND_VIRTUAL_VIEWPORT, useExisting: VirtualContentComponent },\n { provide: VDND_SCROLL_CONTAINER, useExisting: VirtualContentComponent },\n ],\n host: {\n class: 'vdnd-virtual-content',\n '[attr.data-content-offset]': 'effectiveContentOffset()',\n '[attr.data-item-height]': 'itemHeight()',\n '[attr.data-total-items]': 'totalItems()',\n },\n styles: `\n :host {\n display: block;\n position: relative;\n }\n\n .vdnd-virtual-area {\n position: relative;\n }\n\n .vdnd-content-spacer {\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n visibility: hidden;\n pointer-events: none;\n }\n\n .vdnd-content-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n will-change: transform;\n }\n `,\n template: `\n <!-- Projected header — in normal document flow, auto-measured via ResizeObserver -->\n <ng-content select=\"[vdndContentHeader]\" />\n\n <!-- Virtual area — sized to totalHeight, contains absolute-positioned spacer + wrapper -->\n <div class=\"vdnd-virtual-area\" [style.height.px]=\"totalHeight()\">\n <!-- Spacer maintains scroll height for the virtual list portion -->\n <div class=\"vdnd-content-spacer\" [style.height.px]=\"totalHeight()\"></div>\n\n <!-- Content wrapper with GPU-accelerated transform -->\n <div class=\"vdnd-content-wrapper\" [style.transform]=\"contentTransform()\">\n <ng-content />\n </div>\n </div>\n `,\n})\nexport class VirtualContentComponent implements VdndVirtualViewport, VdndScrollContainer {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #ngZone = inject(NgZone);\n\n /**\n * The parent scroll container injected via skip-self to get the actual scrollable element.\n * We provide our own VDND_SCROLL_CONTAINER with adjusted values to children.\n */\n readonly #parentScrollContainer = inject(VDND_SCROLL_CONTAINER, { skipSelf: true });\n\n // ========== Content Queries ==========\n\n /** Projected header directive (if any) */\n private readonly headerDirective = contentChild(ContentHeaderDirective);\n\n // ========== Inputs ==========\n\n /** Height of each item in pixels (used as estimate in dynamic mode) */\n itemHeight = input.required<number>();\n\n /**\n * Offset for content above the virtual list (e.g., header height).\n * When a `vdndContentHeader` is projected, this input is ignored —\n * the offset is auto-measured via ResizeObserver.\n * Use this input only when the header lives outside the component.\n */\n contentOffset = input<number>(0);\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n dynamicItemHeight = input<boolean>(false);\n\n // ========== Internal State ==========\n\n /**\n * The actual first rendered item index, set by VirtualForDirective.\n * This accounts for overscan and is used for wrapper positioning.\n */\n readonly #renderStartIndex = signal(0);\n\n /** Auto-measured header height from ResizeObserver */\n readonly #measuredHeaderHeight = signal(0);\n\n // ========== Strategy ==========\n\n /** The virtual scroll strategy, created based on dynamicItemHeight input */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n const height = this.itemHeight();\n return this.dynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n get strategy(): VirtualScrollStrategy {\n return this.#strategy();\n }\n\n // ========== Computed Values ==========\n\n /** Total item count, derived from strategy (populated by VirtualForDirective) */\n readonly totalItems = computed(() => {\n const s = this.#strategy();\n s.version();\n return s.getItemCount();\n });\n\n /** Total height of all items (for scroll height) */\n readonly totalHeight = computed(() => {\n const s = this.#strategy();\n s.version();\n return s.getTotalHeight(s.getItemCount());\n });\n\n /**\n * Effective content offset: when a `vdndContentHeader` directive is projected,\n * returns the auto-measured header height. Otherwise falls back to the\n * `contentOffset` input for backward compatibility.\n */\n readonly effectiveContentOffset = computed(() => {\n const header = this.headerDirective();\n return header ? this.#measuredHeaderHeight() : this.contentOffset();\n });\n\n /**\n * Adjusted scroll position - subtracts the content offset so the virtual scroll\n * calculates visible items correctly relative to where the list starts.\n */\n readonly #adjustedScrollTop = computed(() => {\n return Math.max(0, this.#parentScrollContainer.scrollTop() - this.effectiveContentOffset());\n });\n\n /** Transform for content wrapper positioning */\n readonly contentTransform = computed(() => {\n const startIndex = this.#renderStartIndex();\n const s = this.#strategy();\n const offset = s.getOffsetForIndex(startIndex);\n return `translateY(${offset}px)`;\n });\n\n constructor() {\n this.#setupHeaderMeasurement();\n }\n\n // ========== VdndVirtualViewport Implementation ==========\n\n /** Adjusted scroll position relative to the virtual list start */\n scrollTop(): number {\n return this.#adjustedScrollTop();\n }\n\n containerHeight(): number {\n return this.#parentScrollContainer.containerHeight();\n }\n\n get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Called by VirtualForDirective to inform this viewport of the actual\n * first rendered item index. Used for wrapper positioning.\n */\n setRenderStartIndex(index: number): void {\n this.#renderStartIndex.set(index);\n }\n\n getOffsetForIndex(index: number): number {\n return this.#strategy().getOffsetForIndex(index);\n }\n\n // ========== VdndScrollContainer Implementation ==========\n\n /**\n * Scroll to a specific position, adjusting for content offset.\n */\n scrollTo(options: ScrollToOptions): void {\n const adjustedOptions = { ...options };\n if (adjustedOptions.top !== undefined) {\n // Add offset back when scrolling to ensure correct position\n adjustedOptions.top += this.effectiveContentOffset();\n }\n this.#parentScrollContainer.scrollTo(adjustedOptions);\n }\n\n // ========== Private Methods ==========\n\n /**\n * Sets up an effect that observes the projected header directive's element\n * with a ResizeObserver, keeping `#measuredHeaderHeight` in sync.\n */\n #setupHeaderMeasurement(): void {\n effect((onCleanup) => {\n const dir = this.headerDirective();\n if (!dir) {\n this.#measuredHeaderHeight.set(0);\n return;\n }\n\n const el = dir.elementRef.nativeElement;\n this.#measuredHeaderHeight.set(el.offsetHeight);\n\n let observer: ResizeObserver | null = null;\n this.#ngZone.runOutsideAngular(() => {\n observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height =\n entry.borderBoxSize?.[0]?.blockSize ?? (entry.target as HTMLElement).offsetHeight;\n this.#measuredHeaderHeight.set(height);\n }\n });\n observer.observe(el, { box: 'border-box' });\n });\n\n onCleanup(() => observer?.disconnect());\n });\n }\n}\n","import { afterNextRender, EnvironmentInjector, NgZone } from '@angular/core';\nimport { DragStateService } from '../services/drag-state.service';\nimport { KeyboardDragService } from '../services/keyboard-drag.service';\nimport { PositionCalculatorService } from '../services/position-calculator.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport { ElementCloneService } from '../services/element-clone.service';\nimport { DragEndEvent, DragStartEvent } from '../models/drag-drop.models';\n\n/**\n * Context from the directive needed for keyboard drag operations.\n */\nexport interface KeyboardDragContext {\n element: HTMLElement;\n draggableId: string;\n groupName: string | null;\n data: unknown;\n}\n\n/**\n * Callbacks from the handler back into the directive for events.\n */\nexport interface KeyboardDragCallbacks {\n onDragStart: (event: DragStartEvent) => void;\n onDragEnd: (event: DragEndEvent) => void;\n getParentDroppableId: () => string | null;\n calculateSourceIndex: (element: HTMLElement, droppableElement: HTMLElement | null) => number;\n}\n\n/**\n * Dependencies injected from the directive (non-injectable handler).\n */\nexport interface KeyboardDragDeps {\n dragState: DragStateService;\n keyboardDrag: KeyboardDragService;\n positionCalculator: PositionCalculatorService;\n dragIndexCalculator: DragIndexCalculatorService;\n elementClone: ElementCloneService;\n ngZone: NgZone;\n envInjector: EnvironmentInjector;\n callbacks: KeyboardDragCallbacks;\n getContext: () => KeyboardDragContext;\n}\n\n/**\n * Handles keyboard-initiated drag operations (Space to start, arrows to move, Space/Enter to drop).\n *\n * Extracted from DraggableDirective to encapsulate:\n * - Starting/completing/cancelling keyboard drags\n * - Document-level keyboard listener during active drag\n * - Focus restoration after drag ends\n * - Cross-list movement via arrow keys\n *\n * Provides a unified `handleKey()` method that eliminates the duplicated\n * key→action dispatch that previously existed in both host bindings and\n * a document-level listener.\n */\nexport class KeyboardDragHandler {\n readonly #deps: KeyboardDragDeps;\n #boundKeyDown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(deps: KeyboardDragDeps) {\n this.#deps = deps;\n this.#boundKeyDown = this.#onDocumentKeyDown.bind(this);\n }\n\n /**\n * Whether a keyboard drag is currently active.\n */\n isActive(): boolean {\n return this.#deps.keyboardDrag.isActive();\n }\n\n /**\n * Start a keyboard drag operation.\n */\n activate(): void {\n const ctx = this.#deps.getContext();\n if (!ctx.groupName) {\n return;\n }\n\n const element = ctx.element;\n const rect = element.getBoundingClientRect();\n\n // Find the parent droppable\n const droppableElement = this.#deps.positionCalculator.getDroppableParent(\n element,\n ctx.groupName,\n );\n if (!droppableElement) {\n return;\n }\n\n const droppableId = this.#deps.positionCalculator.getDroppableId(droppableElement);\n if (!droppableId) {\n return;\n }\n\n // Calculate source index\n const sourceIndex = this.#deps.callbacks.calculateSourceIndex(element, droppableElement);\n\n // Get total item count from the droppable\n const totalItemCount = this.#deps.dragIndexCalculator.getTotalItemCount({\n droppableElement,\n isSameList: false,\n draggedItemHeight: rect.height,\n });\n\n // Clone element BEFORE updating drag state\n const clonedElement = this.#deps.elementClone.cloneElement(element);\n\n // Start keyboard drag\n this.#deps.keyboardDrag.startKeyboardDrag(\n {\n draggableId: ctx.draggableId,\n droppableId,\n element,\n clonedElement,\n height: rect.height,\n width: rect.width,\n data: ctx.data,\n },\n sourceIndex,\n totalItemCount,\n droppableId,\n );\n\n // Add document-level keyboard listener (since element is hidden with display:none)\n this.#deps.ngZone.runOutsideAngular(() => {\n document.addEventListener('keydown', this.#boundKeyDown!);\n });\n\n // Emit drag start event\n this.#deps.callbacks.onDragStart({\n draggableId: ctx.draggableId,\n droppableId,\n data: ctx.data,\n position: { x: rect.left, y: rect.top },\n sourceIndex,\n });\n }\n\n /**\n * Unified key dispatch. Returns true if the key was handled.\n * Used by both host bindings and the document-level listener.\n */\n handleKey(event: KeyboardEvent): boolean {\n if (!this.isActive()) {\n return false;\n }\n\n switch (event.key) {\n case ' ': // Space\n case 'Enter':\n event.preventDefault();\n this.complete();\n return true;\n case 'Escape':\n case 'Tab':\n event.preventDefault();\n this.cancel();\n return true;\n case 'ArrowUp':\n event.preventDefault();\n this.#deps.keyboardDrag.moveUp();\n return true;\n case 'ArrowDown':\n event.preventDefault();\n this.#deps.keyboardDrag.moveDown();\n return true;\n case 'ArrowLeft':\n event.preventDefault();\n this.#moveToAdjacentDroppable('left');\n return true;\n case 'ArrowRight':\n event.preventDefault();\n this.#moveToAdjacentDroppable('right');\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Complete a keyboard drag operation (drop the item).\n */\n complete(): void {\n const ctx = this.#deps.getContext();\n const sourceIndex = this.#deps.dragState.sourceIndex() ?? 0;\n const destinationIndex = this.#deps.dragState.placeholderIndex();\n\n // Remove document listener\n this.#cleanupDocumentListener();\n\n // Clear droppable metadata cache from this drag session\n this.#deps.dragIndexCalculator.clearCache();\n\n // Emit drag end event\n this.#deps.callbacks.onDragEnd({\n draggableId: ctx.draggableId,\n droppableId: this.#deps.callbacks.getParentDroppableId() ?? '',\n cancelled: false,\n data: ctx.data,\n sourceIndex,\n destinationIndex,\n });\n\n this.#deps.keyboardDrag.completeKeyboardDrag();\n\n // Restore focus to the moved element after state updates\n this.#restoreFocus(ctx.draggableId);\n }\n\n /**\n * Cancel a keyboard drag operation.\n */\n cancel(): void {\n const ctx = this.#deps.getContext();\n const sourceIndex = this.#deps.dragState.sourceIndex() ?? 0;\n\n // Remove document listener\n this.#cleanupDocumentListener();\n\n // Clear droppable metadata cache from this drag session\n this.#deps.dragIndexCalculator.clearCache();\n\n // Emit drag end event\n this.#deps.callbacks.onDragEnd({\n draggableId: ctx.draggableId,\n droppableId: this.#deps.callbacks.getParentDroppableId() ?? '',\n cancelled: true,\n data: ctx.data,\n sourceIndex,\n destinationIndex: null,\n });\n\n this.#deps.keyboardDrag.cancelKeyboardDrag();\n\n // Restore focus to the original element after state updates\n this.#restoreFocus(ctx.draggableId);\n }\n\n /**\n * Teardown — remove any active document listener.\n */\n destroy(): void {\n this.#cleanupDocumentListener();\n }\n\n /**\n * Restore focus to the dragged element after keyboard drag ends.\n * Uses afterNextRender to ensure Angular has finished updating the DOM\n * (element is no longer hidden after isDragging() becomes false).\n *\n * Uses EnvironmentInjector to ensure callback runs even if the directive\n * is destroyed during cross-list moves.\n */\n #restoreFocus(draggableId: string): void {\n // Capture the destination droppable BEFORE scheduling afterNextRender\n // (the directive may be destroyed during cross-list moves)\n const destinationDroppableId = this.#deps.dragState.activeDroppableId();\n\n afterNextRender(\n () => {\n const element = document.querySelector(\n `[data-draggable-id=\"${draggableId}\"]`,\n ) as HTMLElement | null;\n\n if (element) {\n element.focus();\n } else if (destinationDroppableId) {\n // Fallback: focus the first draggable in the destination container\n const firstDraggable = document.querySelector(\n `[data-droppable-id=\"${destinationDroppableId}\"] [data-draggable-id]`,\n ) as HTMLElement | null;\n firstDraggable?.focus();\n }\n },\n { injector: this.#deps.envInjector },\n );\n }\n\n /**\n * Move to an adjacent droppable in the specified direction.\n */\n #moveToAdjacentDroppable(direction: 'left' | 'right'): void {\n const currentDroppableId = this.#deps.dragState.activeDroppableId();\n if (!currentDroppableId) {\n return;\n }\n\n const groupName = this.#deps.getContext().groupName;\n if (!groupName) {\n return;\n }\n const adjacent = this.#deps.positionCalculator.findAdjacentDroppable(\n currentDroppableId,\n direction,\n groupName,\n );\n\n if (!adjacent) {\n return;\n }\n\n // Maintain the current target index (clamped to the new list's size)\n const currentTargetIndex = this.#deps.keyboardDrag.targetIndex() ?? 0;\n const targetIndex = Math.min(currentTargetIndex, adjacent.itemCount);\n\n this.#deps.keyboardDrag.moveToDroppable(adjacent.id, targetIndex, adjacent.itemCount);\n }\n\n /**\n * Document-level keydown listener active during keyboard drag.\n */\n #onDocumentKeyDown(event: KeyboardEvent): void {\n this.handleKey(event);\n }\n\n /**\n * Remove the document-level keyboard listener.\n */\n #cleanupDocumentListener(): void {\n if (this.#boundKeyDown) {\n document.removeEventListener('keydown', this.#boundKeyDown);\n }\n }\n}\n","import { NgZone } from '@angular/core';\nimport { CursorPosition } from '../models/drag-drop.models';\n\n/**\n * Callbacks from the handler back into the directive for drag lifecycle.\n */\nexport interface PointerDragCallbacks {\n onDragStart: (position: CursorPosition) => void;\n onDragMove: (position: CursorPosition) => void;\n onDragEnd: (cancelled: boolean) => void;\n onPendingChange: (pending: boolean) => void;\n isDragging: () => boolean;\n}\n\n/**\n * Context from the directive needed for pointer drag operations.\n */\nexport interface PointerDragContext {\n element: HTMLElement;\n groupName: string | null;\n disabled: boolean;\n dragHandle: string | undefined;\n dragThreshold: number;\n dragDelay: number;\n}\n\n/**\n * Dependencies injected from the directive (non-injectable handler).\n */\nexport interface PointerDragDeps {\n ngZone: NgZone;\n callbacks: PointerDragCallbacks;\n getContext: () => PointerDragContext;\n}\n\n/**\n * Handles pointer-based (mouse + touch) drag operations.\n *\n * Extracted from DraggableDirective to encapsulate:\n * - Pointer down / move / up lifecycle\n * - Drag threshold detection\n * - Drag delay timer\n * - RAF throttling for move updates\n * - Document-level listener management\n * - Escape key cancellation during pointer drag\n */\nexport class PointerDragHandler {\n readonly #deps: PointerDragDeps;\n\n /** Starting position of the drag */\n #startPosition: CursorPosition | null = null;\n\n /** Whether we're currently tracking a potential drag */\n #isTracking = false;\n\n /** Bound event handlers for cleanup */\n #boundPointerMove: ((e: MouseEvent | TouchEvent) => void) | null = null;\n #boundPointerUp: ((e: MouseEvent | TouchEvent) => void) | null = null;\n #boundKeyDown: ((e: KeyboardEvent) => void) | null = null;\n\n /** Request animation frame ID for drag updates */\n #rafId: number | null = null;\n\n /** Timer ID for drag delay */\n #delayTimerId: ReturnType<typeof setTimeout> | null = null;\n\n /** Whether the delay has been satisfied (user held long enough) */\n #delayReady = false;\n\n constructor(deps: PointerDragDeps) {\n this.#deps = deps;\n this.#boundPointerMove = this.#onPointerMove.bind(this);\n this.#boundPointerUp = this.#onPointerUp.bind(this);\n this.#boundKeyDown = this.#onEscapeKeyDown.bind(this);\n }\n\n /**\n * The position where the user initially pressed down.\n * Used by the directive to calculate grab offset when starting drag.\n */\n getStartPosition(): CursorPosition | null {\n return this.#startPosition;\n }\n\n /**\n * Handle pointer down (mouse or touch).\n * Called from the directive's host binding.\n */\n onPointerDown(event: MouseEvent | TouchEvent, isTouch: boolean): void {\n const ctx = this.#deps.getContext();\n\n if (ctx.disabled) {\n return;\n }\n\n // Without a group, this draggable can't participate in DnD (fail gracefully).\n if (!ctx.groupName) {\n return;\n }\n\n // Check for left mouse button only\n if (!isTouch && (event as MouseEvent).button !== 0) {\n return;\n }\n\n // Check if click is on drag handle (if specified)\n if (ctx.dragHandle) {\n const target = event.target as HTMLElement;\n if (!target.closest(ctx.dragHandle)) {\n return;\n }\n }\n\n // Check for elements that should not trigger drag\n const target = event.target as HTMLElement;\n if (\n target.closest('button, input, textarea, select, [contenteditable]') ||\n target.classList.contains('no-drag')\n ) {\n return;\n }\n\n const delay = ctx.dragDelay;\n\n // For touch events with a delay configured, DON'T call preventDefault() on touchstart.\n // This allows native scrolling to work if the user swipes before the delay fires.\n // For mouse events or touch without delay, prevent default immediately to avoid\n // text selection and other default behaviors.\n if (!isTouch || delay === 0) {\n event.preventDefault();\n }\n event.stopPropagation();\n\n this.#isTracking = true;\n this.#startPosition = PointerDragHandler.#getPosition(event);\n\n // Handle drag delay\n if (delay > 0) {\n this.#delayReady = false;\n this.#delayTimerId = setTimeout(() => {\n this.#delayReady = true;\n this.#deps.callbacks.onPendingChange(true); // Emit ready state when delay passes\n this.#delayTimerId = null;\n }, delay);\n } else {\n this.#delayReady = true;\n }\n\n // Add document-level event listeners\n this.#deps.ngZone.runOutsideAngular(() => {\n if (isTouch) {\n document.addEventListener('touchmove', this.#boundPointerMove!, { passive: false });\n document.addEventListener('touchend', this.#boundPointerUp!);\n document.addEventListener('touchcancel', this.#boundPointerUp!);\n } else {\n document.addEventListener('mousemove', this.#boundPointerMove!);\n document.addEventListener('mouseup', this.#boundPointerUp!);\n }\n // Listen for Escape key on document to cancel drag\n document.addEventListener('keydown', this.#boundKeyDown!);\n });\n }\n\n /**\n * Remove listeners + cancel timers + cancel RAF.\n * Called after pointer up or when cancelling.\n */\n cleanup(): void {\n this.#isTracking = false;\n this.#startPosition = null;\n this.#deps.callbacks.onPendingChange(false); // Clear pending state on cleanup\n this.#cancelDelayTimer();\n\n if (this.#rafId !== null) {\n cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n\n // Remove event listeners\n if (this.#boundPointerMove) {\n document.removeEventListener('mousemove', this.#boundPointerMove);\n document.removeEventListener('touchmove', this.#boundPointerMove);\n }\n if (this.#boundPointerUp) {\n document.removeEventListener('mouseup', this.#boundPointerUp);\n document.removeEventListener('touchend', this.#boundPointerUp);\n document.removeEventListener('touchcancel', this.#boundPointerUp);\n }\n if (this.#boundKeyDown) {\n document.removeEventListener('keydown', this.#boundKeyDown);\n }\n }\n\n /**\n * Full teardown — cleanup + null references.\n */\n destroy(): void {\n this.cleanup();\n }\n\n /**\n * Handle pointer move (mouse or touch).\n */\n #onPointerMove(event: MouseEvent | TouchEvent): void {\n if (!this.#isTracking) {\n return;\n }\n\n const position = PointerDragHandler.#getPosition(event);\n const ctx = this.#deps.getContext();\n\n // Check if we've moved past the threshold\n if (!this.#deps.callbacks.isDragging() && this.#startPosition) {\n const distance = Math.sqrt(\n Math.pow(position.x - this.#startPosition.x, 2) +\n Math.pow(position.y - this.#startPosition.y, 2),\n );\n\n if (distance < ctx.dragThreshold) {\n return;\n }\n\n // If delay is configured and not yet ready, cancel the drag attempt\n // (user moved before the delay was satisfied).\n // DON'T call preventDefault() here - let native scrolling take over.\n if (!this.#delayReady) {\n this.#cancelDelayTimer();\n this.cleanup();\n return;\n }\n\n // Start the drag - now we can prevent default\n event.preventDefault();\n this.#deps.callbacks.onDragStart(position);\n } else if (this.#deps.callbacks.isDragging()) {\n // Already dragging - prevent default to stop scrolling\n event.preventDefault();\n }\n\n // Only update drag if we're actually dragging\n if (!this.#deps.callbacks.isDragging()) {\n return;\n }\n\n // Throttle drag updates with requestAnimationFrame\n if (this.#rafId !== null) {\n cancelAnimationFrame(this.#rafId);\n }\n\n this.#rafId = requestAnimationFrame(() => {\n this.#deps.callbacks.onDragMove(position);\n this.#rafId = null;\n });\n }\n\n /**\n * Handle pointer up (mouse or touch).\n */\n #onPointerUp(event: MouseEvent | TouchEvent): void {\n if (!this.#isTracking) {\n return;\n }\n\n // Only prevent default if we were actually dragging\n // Otherwise, allow native touch behavior (like scroll momentum) to complete\n if (this.#deps.callbacks.isDragging()) {\n event.preventDefault();\n this.#deps.callbacks.onDragEnd(false);\n }\n\n this.cleanup();\n }\n\n /**\n * Cancel the delay timer if active.\n */\n #cancelDelayTimer(): void {\n if (this.#delayTimerId !== null) {\n clearTimeout(this.#delayTimerId);\n this.#delayTimerId = null;\n }\n this.#delayReady = false;\n }\n\n /**\n * Handle keydown events on document to cancel drag with Escape.\n */\n #onEscapeKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.#deps.callbacks.isDragging()) {\n // No ngZone.run() needed - #endDrag uses signals which work outside zone\n this.#deps.callbacks.onDragEnd(true);\n this.cleanup();\n }\n }\n\n /**\n * Get position from mouse or touch event.\n */\n static #getPosition(event: MouseEvent | TouchEvent): CursorPosition {\n if ('touches' in event) {\n const touch = event.touches[0] ?? event.changedTouches[0];\n return { x: touch.clientX, y: touch.clientY };\n }\n return { x: event.clientX, y: event.clientY };\n }\n}\n","import {\n computed,\n Directive,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { DragStateService } from '../services/drag-state.service';\nimport { PositionCalculatorService } from '../services/position-calculator.service';\nimport { AutoScrollService } from '../services/auto-scroll.service';\nimport { ElementCloneService } from '../services/element-clone.service';\nimport { KeyboardDragService } from '../services/keyboard-drag.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport {\n CursorPosition,\n DragEndEvent,\n DragStartEvent,\n GrabOffset,\n} from '../models/drag-drop.models';\nimport { VDND_GROUP_TOKEN } from './droppable-group.directive';\nimport { createEffectiveGroupSignal } from '../utils/group-resolution';\nimport { KeyboardDragHandler } from '../handlers/keyboard-drag.handler';\nimport { PointerDragHandler } from '../handlers/pointer-drag.handler';\n\n/**\n * Makes an element draggable within the virtual scroll drag-and-drop system.\n *\n * @example\n * ```html\n * <!-- With explicit group -->\n * <div\n * vdndDraggable=\"item-1\"\n * vdndDraggableGroup=\"my-group\"\n * [vdndDraggableData]=\"item\">\n * Drag me!\n * </div>\n *\n * <!-- With inherited group from parent vdndGroup directive -->\n * <div vdndGroup=\"my-group\">\n * <div vdndDraggable=\"item-1\" [vdndDraggableData]=\"item\">\n * Drag me!\n * </div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndDraggable]',\n host: {\n '[attr.data-draggable-id]': 'vdndDraggable()',\n '[class.vdnd-draggable]': 'true',\n '[class.vdnd-draggable-dragging]': 'isDragging()',\n '[class.vdnd-draggable-disabled]': 'disabled()',\n '[class.vdnd-drag-pending]': 'isPending()',\n '[style.display]': 'isDragging() ? \"none\" : null',\n '[attr.aria-grabbed]': 'isDragging() ? \"true\" : \"false\"',\n '[tabindex]': 'disabled() ? -1 : 0',\n '(mousedown)': 'onPointerDown($event, false)',\n '(touchstart)': 'onPointerDown($event, true)',\n '(keydown.space)': 'onKeyboardActivate($event)',\n '(keydown.enter)': 'onEnterKey($event)',\n '(keydown.arrowup)': 'onArrowKey($event)',\n '(keydown.arrowdown)': 'onArrowKey($event)',\n '(keydown.arrowleft)': 'onArrowKey($event)',\n '(keydown.arrowright)': 'onArrowKey($event)',\n '(keydown.escape)': 'onEscape()',\n },\n})\nexport class DraggableDirective implements OnInit, OnDestroy {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #dragState = inject(DragStateService);\n readonly #positionCalculator = inject(PositionCalculatorService);\n readonly #autoScroll = inject(AutoScrollService);\n readonly #elementClone = inject(ElementCloneService);\n readonly #keyboardDrag = inject(KeyboardDragService);\n readonly #dragIndexCalculator = inject(DragIndexCalculatorService);\n readonly #ngZone = inject(NgZone);\n readonly #envInjector = inject(EnvironmentInjector);\n readonly #parentGroup = inject(VDND_GROUP_TOKEN, { optional: true });\n\n /** Unique identifier for this draggable */\n vdndDraggable = input.required<string>();\n\n /**\n * Drag-and-drop group name.\n * Optional when a parent `vdndGroup` directive provides the group context.\n */\n vdndDraggableGroup = input<string>();\n\n /**\n * Resolved group name - uses explicit input or falls back to parent group.\n * Returns null (and disables drag) if neither is available.\n */\n readonly #effectiveGroup = createEffectiveGroupSignal({\n explicitGroup: this.vdndDraggableGroup,\n parentGroup: this.#parentGroup,\n elementId: this.vdndDraggable,\n elementType: 'draggable',\n });\n\n /** Optional data associated with this draggable */\n vdndDraggableData = input<unknown>();\n\n /** Whether this draggable is disabled */\n disabled = input<boolean>(false);\n\n /** CSS selector for drag handle (if not provided, entire element is draggable) */\n dragHandle = input<string>();\n\n /** Minimum distance to move before drag starts (prevents accidental drags) */\n dragThreshold = input<number>(5);\n\n /**\n * Delay in milliseconds before drag starts after pointer down.\n * User must hold without moving for this duration.\n * Set to 0 for immediate drag (default behavior).\n */\n dragDelay = input<number>(0);\n\n /** Lock dragging to a single axis ('x' = horizontal only, 'y' = vertical only) */\n lockAxis = input<'x' | 'y' | null>(null);\n\n /** Emits when drag starts */\n dragStart = output<DragStartEvent>();\n\n /** Emits when drag ends */\n dragEnd = output<DragEndEvent>();\n\n /** Whether this element is in the \"ready to drag\" state (delay has passed) */\n #isPending = signal(false);\n readonly isPending = this.#isPending.asReadonly();\n\n /** Whether this element is currently being dragged (based on global drag state) */\n readonly isDragging = computed(() => {\n const draggedItem = this.#dragState.draggedItem();\n return draggedItem?.draggableId === this.vdndDraggable();\n });\n\n #keyboardHandler!: KeyboardDragHandler;\n #pointerHandler!: PointerDragHandler;\n\n /** Cached constraint flag from source droppable */\n #constrainToContainer = false;\n\n /** Element whose rect is used for clamping (scroll container or droppable itself) */\n #constraintElement: HTMLElement | null = null;\n\n /** Last raw pointer position from pointer move events (not clamped) */\n #lastRawPosition: CursorPosition | null = null;\n\n /**\n * Update the pending state and emit the change event.\n */\n #setPending(pending: boolean): void {\n if (this.#isPending() !== pending) {\n this.#isPending.set(pending);\n }\n }\n\n /**\n * Find the element to use for container constraint clamping.\n * If the droppable is inside a scrollable container, use that container's rect\n * (which represents the visible viewport) instead of the droppable's rect\n * (which may extend far beyond the viewport in virtual scroll scenarios).\n */\n #findConstraintElement(droppableElement: HTMLElement | null): HTMLElement | null {\n if (!droppableElement) return null;\n const scrollable = droppableElement.closest('.vdnd-scrollable');\n return (scrollable as HTMLElement) ?? droppableElement;\n }\n\n ngOnInit(): void {\n this.#keyboardHandler = new KeyboardDragHandler({\n dragState: this.#dragState,\n keyboardDrag: this.#keyboardDrag,\n positionCalculator: this.#positionCalculator,\n dragIndexCalculator: this.#dragIndexCalculator,\n elementClone: this.#elementClone,\n ngZone: this.#ngZone,\n envInjector: this.#envInjector,\n callbacks: {\n onDragStart: (event) => this.dragStart.emit(event),\n onDragEnd: (event) => this.dragEnd.emit(event),\n getParentDroppableId: () => this.#getParentDroppableId(),\n calculateSourceIndex: (el, droppable) => this.#calculateSourceIndex(el, droppable),\n },\n getContext: () => ({\n element: this.#elementRef.nativeElement,\n draggableId: this.vdndDraggable(),\n groupName: this.#effectiveGroup(),\n data: this.vdndDraggableData(),\n }),\n });\n\n this.#pointerHandler = new PointerDragHandler({\n ngZone: this.#ngZone,\n callbacks: {\n onDragStart: (position) => this.#startDrag(position),\n onDragMove: (position) => {\n this.#lastRawPosition = position;\n this.#updateDrag(position);\n },\n onDragEnd: (cancelled) => this.#endDrag(cancelled),\n onPendingChange: (pending) => this.#setPending(pending),\n isDragging: () => this.isDragging(),\n },\n getContext: () => ({\n element: this.#elementRef.nativeElement,\n groupName: this.#effectiveGroup(),\n disabled: this.disabled(),\n dragHandle: this.dragHandle(),\n dragThreshold: this.dragThreshold(),\n dragDelay: this.dragDelay(),\n }),\n });\n }\n\n ngOnDestroy(): void {\n // If destroyed mid-drag, cancel to avoid stale global state / ongoing RAF loops.\n if (this.isDragging()) {\n this.#endDrag(true);\n }\n this.#pointerHandler.destroy();\n this.#keyboardHandler.destroy();\n }\n\n /**\n * Handle pointer down (mouse or touch).\n */\n protected onPointerDown(event: MouseEvent | TouchEvent, isTouch: boolean): void {\n this.#pointerHandler.onPointerDown(event, isTouch);\n }\n\n /**\n * Handle keyboard activation (space key).\n * Starts a keyboard drag if not dragging, or drops if already in keyboard drag mode.\n */\n protected onKeyboardActivate(event: Event): void {\n if (this.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation(); // Prevent document listener from receiving this event\n\n // If we're in a keyboard drag, Space drops the item\n if (this.#keyboardHandler.isActive()) {\n this.#keyboardHandler.complete();\n return;\n }\n\n // If we're in a pointer drag, ignore\n if (this.isDragging()) {\n return;\n }\n\n // Start keyboard drag\n this.#keyboardHandler.activate();\n }\n\n /**\n * Handle Enter key (alternative to Space for dropping during keyboard drag).\n */\n protected onEnterKey(event: Event): void {\n if (this.#keyboardHandler.isActive()) {\n event.preventDefault();\n this.#keyboardHandler.complete();\n }\n }\n\n /**\n * Handle arrow keys during keyboard drag.\n */\n protected onArrowKey(event: Event): void {\n if (this.#keyboardHandler.isActive()) {\n this.#keyboardHandler.handleKey(event as KeyboardEvent);\n }\n }\n\n /**\n * Handle escape key to cancel drag (host binding, fires before element is hidden).\n */\n protected onEscape(): boolean {\n if (this.#keyboardHandler.isActive()) {\n this.#keyboardHandler.cancel();\n return false;\n }\n if (this.isDragging()) {\n this.#endDrag(true);\n this.#pointerHandler.cleanup();\n return false; // Prevents default\n }\n return true;\n }\n\n /**\n * Start the drag operation.\n */\n #startDrag(position: CursorPosition): void {\n // Clear pending state - drag is now active\n this.#setPending(false);\n\n const element = this.#elementRef.nativeElement;\n const rect = element.getBoundingClientRect();\n\n // Calculate grab offset using the START position (where user initially pressed down)\n // NOT the current position (where drag threshold was exceeded)\n // This ensures the preview maintains its position relative to where the user grabbed it\n const startPos = this.#pointerHandler.getStartPosition() ?? position;\n const grabOffset: GrabOffset = {\n x: startPos.x - rect.left,\n y: startPos.y - rect.top,\n };\n\n // Clone element BEFORE updating drag state (which triggers display:none via host binding)\n const clonedElement = this.#elementClone.cloneElement(element);\n\n const parentDroppableId = this.#getParentDroppableId();\n\n // Find droppable and calculate initial placeholder position\n // This fixes the UI glitch by ensuring placeholder is set before the element is hidden\n const groupName = this.#effectiveGroup();\n if (!groupName) {\n // Misconfigured - cancel tracking and don't start drag.\n this.#pointerHandler.cleanup();\n return;\n }\n const droppableElement = this.#positionCalculator.findDroppableAtPoint(\n position.x,\n position.y,\n element,\n groupName,\n );\n\n // Cache constraint flag and element for clamping during drag\n this.#constrainToContainer =\n droppableElement?.hasAttribute('data-constrain-to-container') ?? false;\n this.#constraintElement = this.#constrainToContainer\n ? this.#findConstraintElement(droppableElement)\n : null;\n\n const activeDroppableId = droppableElement\n ? this.#positionCalculator.getDroppableId(droppableElement)\n : parentDroppableId;\n\n // Calculate source index BEFORE the element is hidden (display: none)\n // This is critical because getBoundingClientRect() returns all zeros for hidden elements\n const sourceIndex = this.#calculateSourceIndex(element, droppableElement);\n\n let initialPlaceholderId: string | null = null;\n let initialPlaceholderIndex: number | null = null;\n\n if (droppableElement) {\n const indexResult = this.#dragIndexCalculator.calculatePlaceholderIndex({\n droppableElement,\n position,\n previousPosition: null,\n grabOffset,\n draggedItemHeight: rect.height,\n sourceDroppableId: parentDroppableId,\n sourceIndex,\n });\n initialPlaceholderIndex = indexResult.index;\n initialPlaceholderId = indexResult.placeholderId;\n }\n\n const lockAxis = this.lockAxis();\n\n // Register with drag state service - this triggers isDragging computed to become true\n // which will apply display:none via host binding\n // No ngZone.run() needed - signals work outside zone and effects react automatically\n this.#dragState.startDrag(\n {\n draggableId: this.vdndDraggable(),\n droppableId: parentDroppableId ?? '',\n element,\n clonedElement,\n height: rect.height,\n width: rect.width,\n data: this.vdndDraggableData(),\n },\n position,\n grabOffset,\n lockAxis,\n activeDroppableId,\n initialPlaceholderId,\n initialPlaceholderIndex,\n sourceIndex,\n undefined,\n lockAxis ? startPos : undefined,\n );\n\n // Start auto-scroll monitoring with a callback to recalculate placeholder\n this.#autoScroll.startMonitoring(() => this.#recalculatePlaceholder());\n\n // Emit drag start event\n this.dragStart.emit({\n draggableId: this.vdndDraggable(),\n droppableId: parentDroppableId ?? '',\n data: this.vdndDraggableData(),\n position,\n sourceIndex,\n });\n }\n\n /**\n * Calculate the source index of the dragged element BEFORE it's hidden.\n * This must be called before startDrag updates the state (which triggers display:none).\n * Uses strategy-based lookup when available for accurate handling of variable heights.\n */\n #calculateSourceIndex(element: HTMLElement, droppableElement: HTMLElement | null): number {\n if (!droppableElement) {\n return 0;\n }\n\n const rect = element.getBoundingClientRect();\n const virtualScroll = droppableElement.querySelector('vdnd-virtual-scroll');\n const virtualContent = droppableElement.matches('vdnd-virtual-content')\n ? droppableElement\n : droppableElement.closest('vdnd-virtual-content');\n\n let containerRect: DOMRect;\n let scrollTop: number;\n\n if (virtualScroll) {\n containerRect = (virtualScroll as HTMLElement).getBoundingClientRect();\n scrollTop = (virtualScroll as HTMLElement).scrollTop;\n } else if (virtualContent) {\n // Page-level scroll: use scrollable parent rect + content offset so that\n // relativeY is measured from the start of the virtual items, not the header.\n const scrollableParent = virtualContent.closest('.vdnd-scrollable') as HTMLElement | null;\n if (scrollableParent) {\n containerRect = scrollableParent.getBoundingClientRect();\n const contentOffsetAttr = (virtualContent as HTMLElement).getAttribute(\n 'data-content-offset',\n );\n const contentOffset = contentOffsetAttr ? parseFloat(contentOffsetAttr) : 0;\n scrollTop =\n scrollableParent.scrollTop - (Number.isFinite(contentOffset) ? contentOffset : 0);\n } else {\n containerRect = (virtualContent as HTMLElement).getBoundingClientRect();\n scrollTop = 0;\n }\n } else {\n containerRect = droppableElement.getBoundingClientRect();\n scrollTop = droppableElement.scrollTop;\n }\n\n // Try to use registered strategy for accurate offset-based lookup\n const droppableId = this.#positionCalculator.getDroppableId(droppableElement);\n if (droppableId) {\n const strategy = this.#dragIndexCalculator.getStrategyForDroppable(droppableId);\n if (strategy) {\n const relativeY = rect.top - containerRect.top + scrollTop;\n return strategy.findIndexAtOffset(relativeY);\n }\n }\n\n // Fallback: Use fixed-height math if no strategy available\n const itemHeight = rect.height || 50;\n const relativeY = rect.top - containerRect.top + scrollTop;\n return Math.round(relativeY / itemHeight);\n }\n\n /**\n * Recalculate placeholder position (called during auto-scroll).\n */\n #recalculatePlaceholder(): void {\n const cursorPosition = this.#dragState.cursorPosition();\n if (!cursorPosition || !this.isDragging()) {\n return;\n }\n\n // Recalculate placeholder based on current scroll position\n this.#updateDrag(cursorPosition);\n }\n\n /**\n * Clamp cursor position to source container boundaries when constrainToContainer is enabled.\n */\n #clampToContainer(position: CursorPosition): CursorPosition {\n if (!this.#constrainToContainer || !this.#constraintElement) {\n return position;\n }\n\n const containerRect = this.#constraintElement.getBoundingClientRect();\n const grabOffset = this.#dragState.grabOffset();\n if (!grabOffset) {\n return position;\n }\n\n const draggedItem = this.#dragState.draggedItem();\n const itemHeight = draggedItem?.height ?? 0;\n const itemWidth = draggedItem?.width ?? 0;\n\n const minY = containerRect.top + grabOffset.y + 1;\n const maxY = containerRect.bottom - (itemHeight - grabOffset.y) - 1;\n const minX = containerRect.left + grabOffset.x + 1;\n const maxX = containerRect.right - (itemWidth - grabOffset.x) - 1;\n\n return {\n x: Math.max(minX, Math.min(position.x, maxX)),\n y: Math.max(minY, Math.min(position.y, maxY)),\n };\n }\n\n /**\n * Update the drag position.\n * @param position Current cursor position\n */\n #updateDrag(position: CursorPosition): void {\n const element = this.#elementRef.nativeElement;\n const groupName = this.#effectiveGroup();\n if (!groupName) {\n // Group became unavailable mid-drag; cancel to avoid inconsistent state.\n this.#endDrag(true);\n this.#pointerHandler.cleanup();\n return;\n }\n\n // Apply axis locking to effective position for droppable detection\n // When axis is locked, use the start position for the locked axis\n const axisLock = this.lockAxis();\n const startPos = this.#pointerHandler.getStartPosition();\n let effectivePosition = position;\n\n if (axisLock && startPos) {\n effectivePosition = {\n x: axisLock === 'x' ? startPos.x : position.x,\n y: axisLock === 'y' ? startPos.y : position.y,\n };\n }\n\n // Apply container clamping after axis locking\n effectivePosition = this.#clampToContainer(effectivePosition);\n\n // Update autoscroll cursor: use raw pointer position clamped to container\n // edges (without grabOffset) so autoscroll threshold is reachable regardless\n // of where the user grabbed the item.\n if (this.#constrainToContainer && this.#constraintElement && this.#lastRawPosition) {\n const rect = this.#constraintElement.getBoundingClientRect();\n let scrollCursor: CursorPosition = this.#lastRawPosition;\n if (axisLock && startPos) {\n scrollCursor = {\n x: axisLock === 'x' ? startPos.x : scrollCursor.x,\n y: axisLock === 'y' ? startPos.y : scrollCursor.y,\n };\n }\n this.#autoScroll.setCursorOverride({\n x: Math.max(rect.left, Math.min(scrollCursor.x, rect.right)),\n y: Math.max(rect.top, Math.min(scrollCursor.y, rect.bottom)),\n });\n }\n\n // Find droppable at effective position (respects axis locking and clamping)\n const droppableElement = this.#positionCalculator.findDroppableAtPoint(\n effectivePosition.x,\n effectivePosition.y,\n element,\n groupName,\n );\n\n const activeDroppableId = droppableElement\n ? this.#positionCalculator.getDroppableId(droppableElement)\n : null;\n\n let placeholderId: string | null = null;\n let placeholderIndex: number | null = null;\n\n if (droppableElement) {\n // Calculate placeholder index based on effective position using mathematical approach\n // This is more stable than DOM-based detection because it doesn't get affected\n // by the placeholder insertion shifting elements around\n const draggedItemHeight = this.#dragState.draggedItem()?.height ?? 50;\n const indexResult = this.#dragIndexCalculator.calculatePlaceholderIndex({\n droppableElement,\n position: effectivePosition,\n previousPosition: this.#dragState.cursorPosition(),\n grabOffset: this.#dragState.grabOffset(),\n draggedItemHeight,\n sourceDroppableId: this.#dragState.sourceDroppableId(),\n sourceIndex: this.#dragState.sourceIndex(),\n });\n placeholderIndex = indexResult.index;\n placeholderId = indexResult.placeholderId;\n }\n\n // Update drag state with effective position (respects axis locking and container clamping)\n // No ngZone.run() needed - signals work outside zone and effects react automatically\n this.#dragState.updateDragPosition({\n cursorPosition: effectivePosition,\n activeDroppableId,\n placeholderId,\n placeholderIndex,\n });\n }\n\n /**\n * End the drag operation.\n */\n #endDrag(cancelled: boolean): void {\n // No ngZone.run() needed - signals work outside zone and effects react automatically\n // Stop auto-scroll monitoring\n this.#autoScroll.stopMonitoring();\n\n // Clear droppable metadata cache from this drag session\n this.#dragIndexCalculator.clearCache();\n\n // Reset cached constraint state\n this.#constrainToContainer = false;\n this.#constraintElement = null;\n this.#lastRawPosition = null;\n\n const sourceIndex = this.#dragState.sourceIndex() ?? 0;\n const placeholderIndex = this.#dragState.placeholderIndex();\n let destinationIndex = cancelled ? null : placeholderIndex;\n\n // Keep DragEndEvent semantics consistent with DropEvent.destination.index.\n // During same-list drag, placeholderIndex includes the hidden-item adjustment,\n // but the final insertion index must account for removal of the source item.\n if (!cancelled && placeholderIndex !== null) {\n const sourceDroppableId = this.#dragState.sourceDroppableId();\n const activeDroppableId = this.#dragState.activeDroppableId();\n if (sourceDroppableId !== null && sourceDroppableId === activeDroppableId) {\n if (sourceIndex < placeholderIndex) {\n destinationIndex = placeholderIndex - 1;\n }\n }\n }\n\n // Emit drag end event\n this.dragEnd.emit({\n draggableId: this.vdndDraggable(),\n droppableId: this.#getParentDroppableId() ?? '',\n cancelled,\n data: this.vdndDraggableData(),\n sourceIndex,\n destinationIndex,\n });\n\n // Clear drag state - this triggers isDragging computed to become false\n if (cancelled) {\n this.#dragState.cancelDrag();\n } else {\n this.#dragState.endDrag();\n }\n }\n\n /**\n * Get the parent droppable ID.\n */\n #getParentDroppableId(): string | null {\n const groupName = this.#effectiveGroup();\n if (!groupName) {\n return null;\n }\n\n const droppable = this.#positionCalculator.getDroppableParent(\n this.#elementRef.nativeElement,\n groupName,\n );\n\n return droppable ? this.#positionCalculator.getDroppableId(droppable) : null;\n }\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n} from '@angular/core';\nimport { VDND_SCROLL_CONTAINER, VdndScrollContainer } from '../tokens/scroll-container.token';\nimport { AutoScrollConfig, AutoScrollService } from '../services/auto-scroll.service';\nimport {\n bindRafThrottledScrollTopSignal,\n bindResizeObserverHeightSignal,\n} from '../utils/dom-signal-bindings';\n\n/**\n * Directive that marks an element as a scrollable container for virtual scrolling.\n *\n * Apply this directive to any scrollable element (with `overflow: auto` or `overflow: scroll`)\n * that contains a `*vdndVirtualFor` directive. The virtual scroll will use this element\n * as its scroll container.\n *\n * @example\n * Basic usage with a custom scroll container:\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 400px;\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </div>\n * ```\n *\n * @example\n * With Ionic ion-content:\n * ```html\n * <ion-content vdndScrollable class=\"ion-content-scroll-host\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div>{{ item.name }}</div>\n * </ng-container>\n * </ion-content>\n * ```\n *\n * @example\n * With auto-scroll configuration:\n * ```html\n * <div vdndScrollable\n * [autoScrollEnabled]=\"true\"\n * [autoScrollConfig]=\"{ threshold: 80, maxSpeed: 20 }\"\n * style=\"overflow: auto; height: 400px;\">\n * ...\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndScrollable]',\n providers: [{ provide: VDND_SCROLL_CONTAINER, useExisting: ScrollableDirective }],\n host: {\n class: 'vdnd-scrollable',\n '[style.overflow-anchor]': '\"none\"',\n },\n})\nexport class ScrollableDirective implements VdndScrollContainer, OnInit, OnDestroy {\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #ngZone = inject(NgZone);\n readonly #autoScrollService = inject(AutoScrollService);\n\n /** Current scroll position (reactive) */\n readonly #scrollTop = signal(0);\n\n /** Measured container height (reactive) */\n readonly #containerHeight = signal(0);\n\n /** Cleanup function for scroll listener */\n #scrollCleanup: (() => void) | null = null;\n #resizeCleanup: (() => void) | null = null;\n\n /** Generated ID for auto-scroll registration */\n #generatedScrollId = `vdnd-scroll-${Math.random().toString(36).slice(2, 9)}`;\n\n // ========== Inputs ==========\n\n /** Unique ID for this scroll container (used for auto-scroll registration) */\n scrollContainerId = input<string>();\n\n /** Whether auto-scroll is enabled when dragging near edges */\n autoScrollEnabled = input<boolean>(true);\n\n /** Auto-scroll configuration */\n autoScrollConfig = input<Partial<AutoScrollConfig>>({});\n\n // ========== VdndScrollContainer Implementation ==========\n\n get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n scrollTop(): number {\n return this.#scrollTop();\n }\n\n scrollTo(options: ScrollToOptions): void {\n this.nativeElement.scrollTo(options);\n }\n\n // ========== Additional API ==========\n\n /** Get the measured container height */\n containerHeight(): number {\n return this.#containerHeight();\n }\n\n /** Scroll by a delta amount */\n scrollBy(delta: number): void {\n const newPosition = Math.max(\n 0,\n Math.min(\n this.scrollTop() + delta,\n this.nativeElement.scrollHeight - this.nativeElement.clientHeight,\n ),\n );\n this.scrollTo({ top: newPosition });\n }\n\n // ========== Lifecycle ==========\n\n ngOnInit(): void {\n this.#setupScrollListener();\n this.#setupResizeObserver();\n this.#registerAutoScroll();\n }\n\n ngOnDestroy(): void {\n this.#scrollCleanup?.();\n this.#resizeCleanup?.();\n this.#unregisterAutoScroll();\n }\n\n // ========== Private Methods ==========\n\n /** Minimum scroll delta (px) to trigger signal update */\n readonly #scrollThreshold = 5;\n\n #setupScrollListener(): void {\n this.#scrollCleanup = bindRafThrottledScrollTopSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n scrollTop: this.#scrollTop,\n thresholdPx: this.#scrollThreshold,\n });\n }\n\n #setupResizeObserver(): void {\n this.#resizeCleanup = bindResizeObserverHeightSignal({\n element: this.nativeElement,\n ngZone: this.#ngZone,\n height: this.#containerHeight,\n minDeltaPx: 1,\n });\n }\n\n #registerAutoScroll(): void {\n if (this.autoScrollEnabled()) {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.registerContainer(id, this.nativeElement, this.autoScrollConfig());\n }\n }\n\n #unregisterAutoScroll(): void {\n const id = this.scrollContainerId() ?? this.#generatedScrollId;\n this.#autoScrollService.unregisterContainer(id);\n }\n}\n","import {\n computed,\n Directive,\n effect,\n ElementRef,\n EmbeddedViewRef,\n inject,\n Injector,\n input,\n isDevMode,\n NgZone,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { VDND_SCROLL_CONTAINER } from '../tokens/scroll-container.token';\nimport { VDND_VIRTUAL_VIEWPORT } from '../tokens/virtual-viewport.token';\nimport { DragStateService } from '../services/drag-state.service';\nimport { DragIndexCalculatorService } from '../services/drag-index-calculator.service';\nimport { DroppableDirective } from './droppable.directive';\nimport type { VirtualScrollStrategy } from '../models/virtual-scroll-strategy';\nimport { FixedHeightStrategy } from '../strategies/fixed-height.strategy';\nimport { DynamicHeightStrategy } from '../strategies/dynamic-height.strategy';\n\n/**\n * Context provided to the template for each virtual item.\n */\nexport interface VirtualForContext<T> {\n /** The item data (also available as implicit context) */\n $implicit: T;\n /** The item's index in the original array */\n index: number;\n /** Whether this is the first visible item */\n first: boolean;\n /** Whether this is the last visible item */\n last: boolean;\n /** Count of total items */\n count: number;\n}\n\n/**\n * Represents an item entry in the render queue for virtual scrolling.\n * @internal\n */\ninterface RenderEntry<T> {\n type: 'item' | 'placeholder';\n key: unknown;\n context: VirtualForContext<T> | null;\n visualIndex: number;\n}\n\n/**\n * A structural directive for virtual scrolling within custom scroll containers.\n * Provides maximum flexibility for advanced use cases where the component wrapper\n * is not suitable.\n *\n * The directive must be placed inside a container marked with the `vdndScrollable`\n * directive, which provides the scroll container context via dependency injection.\n *\n * Placeholders are handled automatically by the parent component (vdnd-virtual-scroll\n * or vdnd-virtual-content) - consumers just render their items normally.\n *\n * @example\n * Inside a viewport component (itemHeight and droppableId inherited automatically):\n * ```html\n * <vdnd-virtual-viewport [itemHeight]=\"50\" style=\"height: 400px\">\n * <ng-container *vdndVirtualFor=\"let item of items(); trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </vdnd-virtual-viewport>\n * ```\n *\n * @example\n * Standalone usage (itemHeight required):\n * ```html\n * <div vdndScrollable style=\"overflow: auto; height: 400px\">\n * <ng-container *vdndVirtualFor=\"let item of items(); itemHeight: 50; trackBy: trackById\">\n * <div class=\"item\">{{ item.name }}</div>\n * </ng-container>\n * </div>\n * ```\n */\n@Directive({\n selector: '[vdndVirtualFor][vdndVirtualForOf]',\n})\nexport class VirtualForDirective<T> implements OnInit, OnDestroy {\n readonly #templateRef = inject(TemplateRef<VirtualForContext<T>>);\n readonly #viewContainer = inject(ViewContainerRef);\n readonly #elementRef = inject(ElementRef<Comment>);\n readonly #scrollContainer = inject(VDND_SCROLL_CONTAINER);\n readonly #injector = inject(Injector);\n readonly #ngZone = inject(NgZone);\n readonly #dragState = inject(DragStateService);\n readonly #dragIndexCalculator = inject(DragIndexCalculatorService);\n\n /**\n * Optional viewport component that provides wrapper-based positioning.\n * When inside a viewport, items are positioned via the wrapper's transform,\n * so we skip individual absolute positioning.\n */\n readonly #viewport = inject(VDND_VIRTUAL_VIEWPORT, { optional: true });\n\n /**\n * Optional parent droppable directive.\n * When present, droppableId is inherited automatically.\n */\n readonly #droppable = inject(DroppableDirective, { optional: true });\n\n /** Whether we're inside a viewport component (use wrapper positioning) */\n readonly #useViewportPositioning = this.#viewport !== null;\n\n /** Pool of views for reuse */\n readonly #viewPool: EmbeddedViewRef<VirtualForContext<T>>[] = [];\n\n /** Currently active views keyed by their track-by value */\n readonly #activeViews = new Map<unknown, EmbeddedViewRef<VirtualForContext<T>>>();\n\n /** Single spacer element for scroll height */\n #spacer: HTMLDivElement | null = null;\n\n /** Placeholder element for drag operations */\n #placeholder: HTMLDivElement | null = null;\n\n /** Whether placeholder is currently in the DOM */\n #placeholderInDom = false;\n\n /** ResizeObserver for dynamic height measurement */\n #resizeObserver: ResizeObserver | null = null;\n\n /** Map from observed HTMLElement to its trackBy key */\n readonly #observedElements = new WeakMap<HTMLElement, unknown>();\n\n // ========== Inputs ==========\n\n /** The array of items to iterate over */\n vdndVirtualForOf = input.required<T[]>();\n\n /**\n * Height of each item in pixels (used as estimate in dynamic mode).\n * Optional when inside a viewport component — inherited from the viewport's strategy.\n */\n vdndVirtualForItemHeight = input<number>();\n\n /** Track-by function for efficient updates */\n vdndVirtualForTrackBy = input.required<(index: number, item: T) => unknown>();\n\n /** Number of items to render outside the visible area */\n vdndVirtualForOverscan = input<number>(3);\n\n /**\n * ID of the droppable this directive belongs to.\n * Required for placeholder positioning during drag operations.\n */\n vdndVirtualForDroppableId = input<string>();\n\n /**\n * Enable dynamic item height mode.\n * When true, items are auto-measured via ResizeObserver and `itemHeight`\n * serves as the initial estimate for unmeasured items.\n */\n vdndVirtualForDynamicItemHeight = input<boolean>(false);\n\n // ========== Resolved Values ==========\n\n /**\n * Effective droppable ID — uses explicit input or inherits from parent DroppableDirective.\n */\n readonly #effectiveDroppableId = computed(() => {\n return this.vdndVirtualForDroppableId() ?? this.#droppable?.vdndDroppable() ?? undefined;\n });\n\n // ========== Strategy ==========\n\n /**\n * The virtual scroll strategy.\n * If inside a viewport that has a strategy, use that. Otherwise create our own.\n */\n readonly #strategy = computed<VirtualScrollStrategy>(() => {\n // If viewport provides a strategy, use it (shared state for drag-drop)\n const viewportStrategy = this.#viewport?.strategy;\n if (viewportStrategy) return viewportStrategy;\n\n // Create our own strategy (standalone mode — itemHeight is required)\n const height = this.vdndVirtualForItemHeight();\n if (height === undefined) {\n if (isDevMode()) {\n console.warn(\n '[ngx-virtual-dnd] vdndVirtualFor requires itemHeight when not inside a viewport component ' +\n '(vdnd-virtual-viewport or vdnd-virtual-content). Falling back to 50px.',\n );\n }\n return new FixedHeightStrategy(50);\n }\n return this.vdndVirtualForDynamicItemHeight()\n ? new DynamicHeightStrategy(height)\n : new FixedHeightStrategy(height);\n });\n\n // ========== Placeholder Computed Values ==========\n\n /** Whether the placeholder should be shown in this container */\n readonly #shouldShowPlaceholder = computed(() => {\n const droppableId = this.#effectiveDroppableId();\n if (!droppableId) return false;\n if (!this.#dragState.isDragging()) return false;\n return this.#dragState.activeDroppableId() === droppableId;\n });\n\n /** The placeholder index when placeholder should be shown */\n readonly #placeholderIndex = computed(() => {\n if (!this.#shouldShowPlaceholder()) return -1;\n return this.#dragState.placeholderIndex() ?? -1;\n });\n\n // ========== Computed Values ==========\n\n /** First visible item index */\n readonly #firstVisibleIndex = computed(() => {\n const strategy = this.#strategy();\n // Read version to subscribe to dynamic height changes\n strategy.version();\n return strategy.getFirstVisibleIndex(this.#scrollContainer.scrollTop());\n });\n\n /** Number of visible items */\n readonly #visibleCount = computed(() => {\n const height = this.#scrollContainer.containerHeight();\n const strategy = this.#strategy();\n strategy.version();\n const startIndex = this.#firstVisibleIndex();\n return strategy.getVisibleCount(startIndex, height);\n });\n\n /** Range of items to render */\n readonly #renderRange = computed(() => {\n const first = this.#firstVisibleIndex();\n const visible = this.#visibleCount();\n const overscan = this.vdndVirtualForOverscan();\n const total = this.vdndVirtualForOf().length;\n\n const start = Math.max(0, first - overscan);\n const end = Math.min(total - 1, first + visible + overscan);\n\n return { start, end };\n });\n\n /** Map of trackBy keys to item indices for quick lookup */\n readonly #itemIndexMap = computed(() => {\n const items = this.vdndVirtualForOf();\n const trackByFn = this.vdndVirtualForTrackBy();\n const map = new Map<unknown, number>();\n for (let i = 0; i < items.length; i++) {\n map.set(trackByFn(i, items[i]), i);\n }\n return map;\n });\n\n /** Index of the dragged item in this list (-1 if not present or not dragging) */\n readonly #draggedItemIndex = computed(() => {\n const draggedItem = this.#dragState.draggedItem();\n if (!draggedItem) return -1;\n\n const byId = this.#itemIndexMap().get(draggedItem.draggableId);\n if (byId !== undefined) {\n return byId;\n }\n\n const data = draggedItem.data as T | null | undefined;\n if (data !== null && data !== undefined) {\n return this.vdndVirtualForOf().indexOf(data);\n }\n\n return -1;\n });\n\n constructor() {\n // Keep strategy item keys in sync\n effect(() => {\n const items = this.vdndVirtualForOf();\n const trackByFn = this.vdndVirtualForTrackBy();\n const keys = items.map((item, i) => trackByFn(i, item));\n this.#strategy().setItemKeys(keys);\n });\n\n // Register strategy with drag index calculator for accurate position lookups\n effect((onCleanup) => {\n const droppableId = this.#effectiveDroppableId();\n const strategy = this.#strategy();\n if (droppableId) {\n this.#dragIndexCalculator.registerStrategy(droppableId, strategy);\n onCleanup(() => this.#dragIndexCalculator.unregisterStrategy(droppableId));\n }\n });\n\n // Set excluded index persistently during same-list drag.\n // This ensures ALL strategy methods (getTotalHeight, getOffsetForIndex, etc.)\n // correctly skip the hidden item — not just findIndexAtOffset.\n effect(() => {\n const strategy = this.#strategy();\n const draggedIndex = this.#draggedItemIndex();\n const droppableId = this.#effectiveDroppableId();\n const sourceDroppableId = this.#dragState.sourceDroppableId();\n const isDragging = this.#dragState.isDragging();\n\n const isSourceList =\n isDragging && droppableId !== undefined && droppableId === sourceDroppableId;\n\n if (isSourceList && draggedIndex >= 0) {\n strategy.setExcludedIndex(draggedIndex);\n } else {\n strategy.setExcludedIndex(null);\n }\n });\n\n // React to changes and update views\n effect(() => {\n this.#updateViews();\n });\n }\n\n ngOnInit(): void {\n // Only create spacer when NOT inside a viewport component\n // (viewport provides its own spacer and wrapper positioning)\n if (!this.#useViewportPositioning) {\n this.#updateSpacers();\n }\n\n // Create placeholder element for drag operations\n this.#createPlaceholder();\n\n // Set up ResizeObserver for dynamic height mode.\n // Check both the directive's own input and the viewport's strategy (when inherited).\n if (\n this.vdndVirtualForDynamicItemHeight() ||\n this.#strategy() instanceof DynamicHeightStrategy\n ) {\n this.#setupResizeObserver();\n }\n }\n\n ngOnDestroy(): void {\n this.#viewPool.forEach((view) => view.destroy());\n this.#activeViews.forEach((view) => view.destroy());\n\n // Clean up spacer element (only if we created one)\n this.#spacer?.remove();\n\n // Clean up placeholder element\n this.#placeholder?.remove();\n\n // Clean up ResizeObserver\n this.#resizeObserver?.disconnect();\n }\n\n /**\n * Create the placeholder element for drag operations.\n */\n #createPlaceholder(): void {\n const placeholder = document.createElement('div');\n placeholder.className = 'vdnd-drag-placeholder vdnd-drag-placeholder-visible';\n placeholder.style.cssText = 'display: block; pointer-events: none;';\n this.#placeholder = placeholder;\n }\n\n /**\n * Set up spacer element for scroll height.\n */\n #updateSpacers(): void {\n // Create single spacer that maintains total scroll height\n const spacer = document.createElement('div');\n spacer.className = 'vdnd-virtual-for-spacer';\n spacer.style.cssText =\n 'position: absolute; top: 0; left: 0; width: 1px; visibility: hidden; pointer-events: none;';\n\n // Insert spacer before the directive's anchor comment\n const comment = this.#elementRef.nativeElement;\n comment.parentNode?.insertBefore(spacer, comment);\n\n this.#spacer = spacer;\n\n // Update spacer height reactively\n // Must pass injector since we're outside constructor\n effect(\n () => {\n const total = this.vdndVirtualForOf().length;\n const strategy = this.#strategy();\n strategy.version();\n\n // Single spacer with full content height\n spacer.style.height = `${strategy.getTotalHeight(total)}px`;\n },\n { injector: this.#injector },\n );\n }\n\n /**\n * Set up ResizeObserver for dynamic height measurement.\n */\n #setupResizeObserver(): void {\n this.#ngZone.runOutsideAngular(() => {\n this.#resizeObserver = new ResizeObserver((entries) => {\n const strategy = this.#strategy();\n for (const entry of entries) {\n const element = entry.target as HTMLElement;\n const key = this.#observedElements.get(element);\n if (key === undefined) continue;\n\n const height = entry.borderBoxSize?.[0]?.blockSize ?? element.offsetHeight;\n if (height > 0) {\n strategy.setMeasuredHeight(key, height);\n }\n }\n });\n });\n }\n\n /**\n * Observe an element's root nodes for height changes.\n */\n #observeViewElements(view: EmbeddedViewRef<VirtualForContext<T>>, key: unknown): void {\n if (!this.#resizeObserver) return;\n\n for (const node of view.rootNodes) {\n if (node instanceof HTMLElement) {\n const existingKey = this.#observedElements.get(node);\n if (Object.is(existingKey, key)) {\n continue;\n }\n if (existingKey !== undefined) {\n this.#resizeObserver.unobserve(node);\n }\n this.#observedElements.set(node, key);\n this.#resizeObserver.observe(node);\n }\n }\n }\n\n /**\n * Stop observing an element's root nodes.\n */\n #unobserveViewElements(view: EmbeddedViewRef<VirtualForContext<T>>): void {\n if (!this.#resizeObserver) return;\n\n for (const node of view.rootNodes) {\n if (node instanceof HTMLElement) {\n this.#observedElements.delete(node);\n this.#resizeObserver.unobserve(node);\n }\n }\n }\n\n /**\n * Update the rendered views with true view recycling.\n * Views are kept in the DOM and have their context updated in place when possible.\n */\n #updateViews(): void {\n const items = this.vdndVirtualForOf();\n const { start, end } = this.#renderRange();\n const strategy = this.#strategy();\n strategy.version();\n const placeholderIndex = this.#placeholderIndex();\n const showPlaceholder = this.#shouldShowPlaceholder();\n const draggedIndex = this.#draggedItemIndex();\n const droppableId = this.#effectiveDroppableId();\n const sourceDroppableId = this.#dragState.sourceDroppableId();\n const isSourceList = droppableId ? droppableId === sourceDroppableId : true;\n const shouldKeepDragged =\n this.#dragState.isDragging() &&\n draggedIndex >= 0 &&\n isSourceList &&\n draggedIndex < items.length;\n\n // Notify viewport of render start index for wrapper positioning\n this.#notifyViewportRenderStart(start);\n\n // 1. Build the list of items to render\n const itemsToRender = this.#calculateItemsToRender({\n items,\n start,\n end,\n showPlaceholder,\n placeholderIndex,\n shouldKeepDragged,\n draggedIndex,\n });\n\n // 2. Reconcile views with the DOM\n const placeholderDomPosition = this.#reconcileViews(itemsToRender, showPlaceholder, strategy);\n\n // 3. Position placeholder in DOM\n this.#positionPlaceholder(showPlaceholder, placeholderDomPosition, strategy, placeholderIndex);\n\n // 4. Trim view pool to prevent memory bloat\n this.#trimViewPool();\n }\n\n /**\n * Notify viewport of render start index for wrapper positioning.\n * With persistent excluded index, getOffsetForIndex already accounts for hidden items.\n */\n #notifyViewportRenderStart(start: number): void {\n if (!this.#useViewportPositioning) return;\n this.#viewport?.setRenderStartIndex(start);\n }\n\n /**\n * Calculate the list of items to render, including placeholder positioning\n * and keeping the dragged item alive when scrolled out of range.\n */\n #calculateItemsToRender(params: {\n items: T[];\n start: number;\n end: number;\n showPlaceholder: boolean;\n placeholderIndex: number;\n shouldKeepDragged: boolean;\n draggedIndex: number;\n }): RenderEntry<T>[] {\n const {\n items,\n start,\n end,\n showPlaceholder,\n placeholderIndex,\n shouldKeepDragged,\n draggedIndex,\n } = params;\n const trackByFn = this.vdndVirtualForTrackBy();\n const itemsToRender: RenderEntry<T>[] = [];\n\n // Build render list for visible range\n for (let i = start; i <= end && i < items.length; i++) {\n // Insert placeholder before item at placeholderIndex\n if (\n showPlaceholder &&\n placeholderIndex === i &&\n !itemsToRender.some((r) => r.type === 'placeholder')\n ) {\n itemsToRender.push({\n type: 'placeholder',\n key: '__placeholder__',\n context: null,\n visualIndex: placeholderIndex,\n });\n }\n\n const item = items[i];\n itemsToRender.push({\n type: 'item',\n key: trackByFn(i, item),\n context: {\n $implicit: item,\n index: i,\n first: i === start,\n last: i === end || i === items.length - 1,\n count: items.length,\n },\n visualIndex: i,\n });\n }\n\n // Add placeholder at end if needed\n if (\n showPlaceholder &&\n placeholderIndex >= items.length &&\n !itemsToRender.some((r) => r.type === 'placeholder')\n ) {\n itemsToRender.push({\n type: 'placeholder',\n key: '__placeholder__',\n context: null,\n visualIndex: placeholderIndex,\n });\n }\n\n // Keep dragged item view alive when scrolled out of range\n if (shouldKeepDragged && (draggedIndex < start || draggedIndex > end)) {\n const draggedItem = items[draggedIndex];\n const draggedKey = trackByFn(draggedIndex, draggedItem);\n const alreadyRendered = itemsToRender.some(\n (entry) => entry.type === 'item' && entry.key === draggedKey,\n );\n if (!alreadyRendered) {\n itemsToRender.push({\n type: 'item',\n key: draggedKey,\n context: {\n $implicit: draggedItem,\n index: draggedIndex,\n first: draggedIndex === 0,\n last: draggedIndex === items.length - 1,\n count: items.length,\n },\n visualIndex: draggedIndex,\n });\n }\n }\n\n return itemsToRender;\n }\n\n /**\n * Reconcile views with the calculated items to render.\n * Moves unused views to pool, updates existing views, creates new views as needed.\n * Returns the DOM position where placeholder should be inserted.\n */\n #reconcileViews(\n itemsToRender: RenderEntry<T>[],\n showPlaceholder: boolean,\n strategy: VirtualScrollStrategy,\n ): number {\n // Determine which keys we need\n const neededKeys = new Set(\n itemsToRender.filter((r) => r.type === 'item').map((item) => item.key),\n );\n\n // Move unused views to pool\n for (const [key, view] of this.#activeViews) {\n if (!neededKeys.has(key)) {\n const index = this.#viewContainer.indexOf(view);\n if (index >= 0) {\n this.#viewContainer.detach(index);\n }\n this.#unobserveViewElements(view);\n this.#viewPool.push(view);\n this.#activeViews.delete(key);\n }\n }\n\n // Remove placeholder from DOM if not needed\n if (!showPlaceholder && this.#placeholderInDom && this.#placeholder) {\n this.#placeholder.remove();\n this.#placeholderInDom = false;\n }\n\n // Process items and track placeholder position\n let viewContainerIndex = 0;\n let placeholderDomPosition = -1;\n const renderedKeys = new Set<unknown>();\n\n for (const entry of itemsToRender) {\n if (entry.type === 'placeholder') {\n placeholderDomPosition = viewContainerIndex;\n continue;\n }\n\n if (renderedKeys.has(entry.key)) {\n this.#warnDuplicateTrackByKey(entry.key);\n continue;\n }\n renderedKeys.add(entry.key);\n\n const view = this.#getOrCreateView(entry.key, entry.context!);\n\n // Ensure view is at correct position in ViewContainerRef\n const currentIndex = this.#viewContainer.indexOf(view);\n if (currentIndex !== viewContainerIndex) {\n const targetIndex = this.#getSafeViewContainerIndex(currentIndex, viewContainerIndex);\n if (currentIndex >= 0) {\n if (currentIndex !== targetIndex) {\n this.#viewContainer.move(view, targetIndex);\n }\n } else {\n this.#viewContainer.insert(view, targetIndex);\n }\n }\n\n // Apply absolute positioning when not using viewport wrapper\n if (!this.#useViewportPositioning) {\n const offset = strategy.getOffsetForIndex(entry.visualIndex);\n this.#applyAbsolutePositioning(view, offset);\n }\n\n // Observe for dynamic height measurement\n if (this.#resizeObserver) {\n this.#observeViewElements(view, entry.key);\n }\n\n viewContainerIndex++;\n }\n\n return placeholderDomPosition;\n }\n\n /**\n * Clamp target indices for move/insert to avoid out-of-range operations when\n * reconciliation is given invalid duplicate keys or transiently inconsistent view state.\n */\n #getSafeViewContainerIndex(currentIndex: number, requestedIndex: number): number {\n const length = this.#viewContainer.length;\n\n if (currentIndex >= 0) {\n if (length <= 1) return 0;\n return Math.min(requestedIndex, length - 1);\n }\n\n return Math.min(requestedIndex, length);\n }\n\n /**\n * Duplicate trackBy keys cannot be reconciled to distinct views.\n * Warn in dev mode and skip duplicates to prevent container corruption.\n */\n #warnDuplicateTrackByKey(key: unknown): void {\n if (isDevMode()) {\n console.warn(\n `[ngx-virtual-dnd] Duplicate trackBy key detected in vdndVirtualFor: ${String(key)}. ` +\n 'Skipping duplicate item to avoid view reconciliation errors.',\n );\n }\n }\n\n /**\n * Get an existing view or create/recycle one from the pool.\n */\n #getOrCreateView(\n key: unknown,\n context: VirtualForContext<T>,\n ): EmbeddedViewRef<VirtualForContext<T>> {\n let view = this.#activeViews.get(key);\n\n if (view) {\n // Update existing view context\n Object.assign(view.context, context);\n view.markForCheck();\n } else {\n // Try pool first, then create new\n view = this.#viewPool.pop();\n if (view) {\n Object.assign(view.context, context);\n view.markForCheck();\n } else {\n view = this.#templateRef.createEmbeddedView(context);\n }\n this.#activeViews.set(key, view);\n }\n\n return view;\n }\n\n /**\n * Apply absolute positioning styles to a view's root nodes.\n */\n #applyAbsolutePositioning(view: EmbeddedViewRef<VirtualForContext<T>>, topOffset: number): void {\n for (const node of view.rootNodes) {\n if (node instanceof HTMLElement) {\n node.style.position = 'absolute';\n node.style.top = `${topOffset}px`;\n node.style.left = '0';\n node.style.right = '0';\n }\n }\n }\n\n /**\n * Position the placeholder element in the DOM at the correct index.\n */\n #positionPlaceholder(\n showPlaceholder: boolean,\n placeholderDomPosition: number,\n strategy: VirtualScrollStrategy,\n placeholderIndex: number,\n ): void {\n if (!showPlaceholder || !this.#placeholder || placeholderDomPosition < 0) {\n return;\n }\n\n // Use the dragged item's height if available, otherwise use strategy height\n const draggedItemHeight = this.#dragState.draggedItem()?.height;\n const height = draggedItemHeight ?? strategy.getItemHeight(placeholderIndex);\n this.#placeholder.style.height = `${height}px`;\n\n const container = this.#viewContainer.element.nativeElement.parentElement;\n if (!container) return;\n\n // Find children excluding spacers and placeholder itself\n const children = Array.from(container.children).filter((el) => {\n const element = el as Element;\n return (\n !element.classList.contains('vdnd-drag-placeholder') &&\n !element.classList.contains('vdnd-virtual-for-spacer') &&\n !element.classList.contains('vdnd-content-spacer')\n );\n });\n const insertBeforeEl = children[placeholderDomPosition] ?? null;\n\n if (!this.#placeholderInDom) {\n // First insertion\n if (insertBeforeEl) {\n container.insertBefore(this.#placeholder, insertBeforeEl);\n } else {\n container.appendChild(this.#placeholder);\n }\n this.#placeholderInDom = true;\n } else {\n // Move to correct position if needed\n const currentNextSibling = this.#placeholder.nextElementSibling;\n if (insertBeforeEl !== currentNextSibling) {\n if (insertBeforeEl) {\n container.insertBefore(this.#placeholder, insertBeforeEl);\n } else {\n container.appendChild(this.#placeholder);\n }\n }\n }\n }\n\n /**\n * Trim the view pool to prevent memory bloat, keeping a reasonable buffer.\n */\n #trimViewPool(): void {\n const maxPoolSize = 10;\n while (this.#viewPool.length > maxPoolSize) {\n const view = this.#viewPool.pop();\n view?.destroy();\n }\n }\n\n /**\n * Static method for Angular's structural directive microsyntax.\n */\n static ngTemplateContextGuard<T>(\n _dir: VirtualForDirective<T>,\n _ctx: unknown,\n ): _ctx is VirtualForContext<T> {\n return true;\n }\n}\n","import { isDevMode, type WritableSignal } from '@angular/core';\nimport { DropEvent } from '../models/drag-drop.models';\n\n/**\n * Moves an item between signal-based lists based on a drop event.\n * Handles both same-list reordering and cross-list moves.\n *\n * @example\n * ```typescript\n * // In your component:\n * readonly list1 = signal<Item[]>([...]);\n * readonly list2 = signal<Item[]>([...]);\n *\n * onDrop(event: DropEvent): void {\n * moveItem(event, {\n * 'list-1': this.list1,\n * 'list-2': this.list2,\n * });\n * }\n * ```\n *\n * @param event The drop event from the droppable directive\n * @param lists A map of droppable IDs to their corresponding WritableSignal arrays\n */\nexport function moveItem<T>(event: DropEvent, lists: Record<string, WritableSignal<T[]>>): void {\n const sourceList = lists[event.source.droppableId];\n const destList = lists[event.destination.droppableId];\n\n if (!sourceList || !destList) {\n if (isDevMode()) {\n console.warn(\n `[ngx-virtual-dnd] [moveItem] Could not find list for droppable \"${event.source.droppableId}\" or \"${event.destination.droppableId}\"`,\n );\n }\n return;\n }\n\n const sourceIndex = event.source.index;\n const destIndex = event.destination.index;\n\n // Same list reorder\n if (event.source.droppableId === event.destination.droppableId) {\n reorderItems(event, sourceList);\n return;\n }\n\n // Cross-list move\n const sourceItems = sourceList();\n const item = sourceItems[sourceIndex];\n\n if (item === undefined) {\n if (isDevMode()) {\n console.warn(`[ngx-virtual-dnd] [moveItem] Could not find item at index ${sourceIndex}`);\n }\n return;\n }\n\n // Remove from source\n sourceList.update((items) => {\n const newItems = [...items];\n newItems.splice(sourceIndex, 1);\n return newItems;\n });\n\n // Insert at destination\n destList.update((items) => {\n const newItems = [...items];\n newItems.splice(destIndex, 0, item);\n return newItems;\n });\n}\n\n/**\n * Reorders items within a single signal-based list.\n *\n * @example\n * ```typescript\n * readonly items = signal<Item[]>([...]);\n *\n * onDrop(event: DropEvent): void {\n * reorderItems(event, this.items);\n * }\n * ```\n *\n * @param event The drop event from the droppable directive\n * @param list The WritableSignal array to reorder\n */\nexport function reorderItems<T>(event: DropEvent, list: WritableSignal<T[]>): void {\n const sourceIndex = event.source.index;\n const destIndex = event.destination.index;\n\n // No-op if same position\n if (sourceIndex === destIndex) {\n return;\n }\n\n list.update((items) => {\n const newItems = [...items];\n const [removed] = newItems.splice(sourceIndex, 1);\n\n // Note: destination.index from DropEvent is already adjusted for same-list\n // reordering by DroppableDirective.#handleDrop(), so we use it directly.\n newItems.splice(destIndex, 0, removed);\n return newItems;\n });\n}\n\n/**\n * Applies a move operation immutably, returning new array objects.\n * Useful for state management patterns that require immutable updates.\n *\n * @example\n * ```typescript\n * onDrop(event: DropEvent): void {\n * const { list1, list2 } = applyMove(event, {\n * 'list-1': this.list1,\n * 'list-2': this.list2,\n * });\n * // Use the returned arrays with your state management\n * }\n * ```\n *\n * @param event The drop event from the droppable directive\n * @param lists A map of droppable IDs to their corresponding arrays\n * @returns A new object with the same keys but updated arrays\n */\nexport function applyMove<T>(event: DropEvent, lists: Record<string, T[]>): Record<string, T[]> {\n const result = { ...lists };\n const sourceKey = event.source.droppableId;\n const destKey = event.destination.droppableId;\n const sourceIndex = event.source.index;\n const destIndex = event.destination.index;\n\n const sourceItems = [...(lists[sourceKey] ?? [])];\n const item = sourceItems[sourceIndex];\n\n if (item === undefined) {\n return result;\n }\n\n // Same list reorder\n // Note: destination.index from DropEvent is already adjusted for same-list\n // reordering by DroppableDirective.#handleDrop(), so we use it directly.\n if (sourceKey === destKey) {\n const [removed] = sourceItems.splice(sourceIndex, 1);\n sourceItems.splice(destIndex, 0, removed);\n result[sourceKey] = sourceItems;\n return result;\n }\n\n // Cross-list move\n const destItems = [...(lists[destKey] ?? [])];\n sourceItems.splice(sourceIndex, 1);\n destItems.splice(destIndex, 0, item);\n\n result[sourceKey] = sourceItems;\n result[destKey] = destItems;\n\n return result;\n}\n\n/**\n * Checks if a drop event represents a no-op (item dropped in its original position).\n * Useful for skipping unnecessary state updates.\n *\n * @example\n * ```typescript\n * onDrop(event: DropEvent): void {\n * if (isNoOpDrop(event)) {\n * return; // No action needed\n * }\n * moveItem(event, this.lists);\n * }\n * ```\n *\n * @param event The drop event to check\n * @returns true if the drop would result in no change\n */\nexport function isNoOpDrop(event: DropEvent): boolean {\n return (\n event.source.droppableId === event.destination.droppableId &&\n event.source.index === event.destination.index\n );\n}\n\n/**\n * Creates a new list with the item inserted at the specified index.\n * Low-level utility for custom implementations.\n *\n * @param list The source array\n * @param item The item to insert\n * @param index The index to insert at\n * @returns A new array with the item inserted\n */\nexport function insertAt<T>(list: T[], item: T, index: number): T[] {\n const result = [...list];\n result.splice(index, 0, item);\n return result;\n}\n\n/**\n * Creates a new list with the item at the specified index removed.\n * Low-level utility for custom implementations.\n *\n * @param list The source array\n * @param index The index to remove\n * @returns A new array with the item removed\n */\nexport function removeAt<T>(list: T[], index: number): T[] {\n const result = [...list];\n result.splice(index, 1);\n return result;\n}\n","// Models\nexport * from './models/drag-drop.models';\nexport type { VirtualScrollStrategy } from './models/virtual-scroll-strategy';\n\n// Strategies\nexport { FixedHeightStrategy } from './strategies/fixed-height.strategy';\nexport { DynamicHeightStrategy } from './strategies/dynamic-height.strategy';\n\n// Tokens\nexport { VDND_SCROLL_CONTAINER } from './tokens/scroll-container.token';\nexport type { VdndScrollContainer } from './tokens/scroll-container.token';\nexport { VDND_VIRTUAL_VIEWPORT } from './tokens/virtual-viewport.token';\nexport type { VdndVirtualViewport } from './tokens/virtual-viewport.token';\n\n// Services\nexport { DragStateService } from './services/drag-state.service';\nexport { PositionCalculatorService } from './services/position-calculator.service';\nexport { AutoScrollService } from './services/auto-scroll.service';\nexport type { AutoScrollConfig } from './services/auto-scroll.service';\nexport { ElementCloneService } from './services/element-clone.service';\nexport { KeyboardDragService } from './services/keyboard-drag.service';\nexport { OverlayContainerService } from './services/overlay-container.service';\n\n// Components\nexport { VirtualScrollContainerComponent } from './components/virtual-scroll-container.component';\nexport type { VirtualScrollItemContext } from './components/virtual-scroll-container.component';\nexport { DragPreviewComponent } from './components/drag-preview.component';\nexport type { DragPreviewContext } from './components/drag-preview.component';\nexport { PlaceholderComponent } from './components/placeholder.component';\nexport type { PlaceholderContext } from './components/placeholder.component';\nexport { DragPlaceholderComponent } from './components/drag-placeholder.component';\nexport { VirtualSortableListComponent } from './components/virtual-sortable-list.component';\nexport { VirtualViewportComponent } from './components/virtual-viewport.component';\nexport { VirtualContentComponent } from './components/virtual-content.component';\n\n// Directives\nexport { DraggableDirective } from './directives/draggable.directive';\nexport { DroppableDirective } from './directives/droppable.directive';\nexport { DroppableGroupDirective, VDND_GROUP_TOKEN } from './directives/droppable-group.directive';\nexport type { VdndGroupContext } from './directives/droppable-group.directive';\nexport { ScrollableDirective } from './directives/scrollable.directive';\nexport { VirtualForDirective } from './directives/virtual-for.directive';\nexport type { VirtualForContext } from './directives/virtual-for.directive';\nexport { ContentHeaderDirective } from './directives/content-header.directive';\n\n// Utilities\nexport {\n moveItem,\n reorderItems,\n applyMove,\n isNoOpDrop,\n insertAt,\n removeAt,\n} from './utils/drop-helpers';\n","/*\n * Public API Surface of ngx-virtual-dnd\n */\n\nexport * from './lib/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}