@dnd-block-tree/vanilla 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { BaseBlock, BlockRendererProps as BlockRendererProps$1, BlockRenderers as BlockRenderers$1, OrderingStrategy, CanDragFn, CanDropFn, IdGeneratorFn, SensorConfig, BlockTreeCallbacks, ContainerRendererProps as ContainerRendererProps$1, InternalRenderers as InternalRenderers$1, RendererPropsFor as RendererPropsFor$1, BlockTreeInstance, Rect, CollisionCandidate, CoreCollisionDetection } from '@dnd-block-tree/core';
2
- export { AnimationConfig, AutoExpandConfig, BaseBlock, BlockAction, BlockAddEvent, BlockDeleteEvent, BlockIndex, BlockMoveEvent, BlockPosition, BlockStateContextValue, BlockTreeCallbacks, BlockTreeConfig, BlockTreeCustomization, BlockTreeEvents, BlockTreeInstance, BlockTreeOptions, CanDragFn, CanDropFn, CollisionCandidate, CollisionResult, CoreCollisionDetection, DragEndEvent, DragMoveEvent, DragStartEvent, DropZoneConfig, DropZoneType, EventEmitter, ExpandAction, ExpandChangeEvent, HistoryAction, HistoryState, HoverChangeEvent, IdGeneratorFn, MoveOperation, NestedBlock, OrderingStrategy, Rect, SensorConfig, SnapshotRectsRef, TreeValidationResult, blockReducer, buildOrderedBlocks, cloneMap, cloneParentMap, closestCenterCollision, compareFractionalKeys, computeNormalizedIndex, createBlockTree, createStickyCollision, debounce, deleteBlockAndDescendants, expandReducer, extractBlockId, extractUUID, flatToNested, generateId, generateInitialKeys, generateKeyBetween, generateNKeysBetween, getBlockDepth, getDescendantIds, getDropZoneType, getSubtreeDepth, historyReducer, initFractionalOrder, nestedToFlat, reparentBlockIndex, reparentMultipleBlocks, validateBlockTree, weightedVerticalCollision } from '@dnd-block-tree/core';
1
+ import { BaseBlock, BlockRendererProps as BlockRendererProps$1, BlockRenderers as BlockRenderers$1, OrderingStrategy, CanDragFn, CanDropFn, IdGeneratorFn, SensorConfig, BlockTreeCallbacks, ContainerRendererProps as ContainerRendererProps$1, InternalRenderers as InternalRenderers$1, RendererPropsFor as RendererPropsFor$1, BlockTreeInstance, Rect, CollisionCandidate, CoreCollisionDetection, MergeBlockVersionsOptions } from '@dnd-block-tree/core';
2
+ export { AnimationConfig, AutoExpandConfig, BaseBlock, BlockAction, BlockAddEvent, BlockDeleteEvent, BlockIndex, BlockMoveEvent, BlockPosition, BlockStateContextValue, BlockTreeCallbacks, BlockTreeConfig, BlockTreeCustomization, BlockTreeEvents, BlockTreeInstance, BlockTreeOptions, CanDragFn, CanDropFn, CollisionCandidate, CollisionResult, CoreCollisionDetection, DragEndEvent, DragMoveEvent, DragStartEvent, DropZoneConfig, DropZoneType, EventEmitter, ExpandAction, ExpandChangeEvent, HistoryAction, HistoryState, HoverChangeEvent, IdGeneratorFn, MergeBlockVersionsOptions, MoveOperation, NestedBlock, OrderingStrategy, Rect, SensorConfig, SnapshotRectsRef, TreeValidationResult, blockReducer, buildOrderedBlocks, cloneMap, cloneParentMap, closestCenterCollision, compareFractionalKeys, computeNormalizedIndex, createBlockTree, createStickyCollision, debounce, deleteBlockAndDescendants, expandReducer, extractBlockId, extractUUID, flatToNested, generateId, generateInitialKeys, generateKeyBetween, generateNKeysBetween, getBlockDepth, getDescendantIds, getDropZoneType, getSubtreeDepth, historyReducer, initFractionalOrder, mergeBlockVersions, nestedToFlat, reparentBlockIndex, reparentMultipleBlocks, validateBlockTree, weightedVerticalCollision } from '@dnd-block-tree/core';
3
3
 
4
4
  type BlockRendererProps<T extends BaseBlock = BaseBlock> = BlockRendererProps$1<T, HTMLElement>;
5
5
  type ContainerRendererProps<T extends BaseBlock = BaseBlock> = ContainerRendererProps$1<T, HTMLElement>;
@@ -142,6 +142,54 @@ interface BlockHistory<T extends BaseBlock> {
142
142
  */
143
143
  declare function createBlockHistory<T extends BaseBlock>(initialBlocks: T[], options?: BlockHistoryOptions): BlockHistory<T>;
144
144
 
145
+ interface DeferredSyncOptions<T extends BaseBlock> {
146
+ /** Called when remote data is applied (only when not busy) */
147
+ onResolve?: (blocks: T[]) => void;
148
+ /** Options passed to mergeBlockVersions when using 'merge' strategy */
149
+ mergeOptions?: MergeBlockVersionsOptions;
150
+ }
151
+ interface DeferredSync<T extends BaseBlock> {
152
+ /** Whether sync is currently deferred */
153
+ isBusy(): boolean;
154
+ /** Apply remote blocks — queues if busy, calls onResolve if idle */
155
+ apply(remoteBlocks: T[]): void;
156
+ /** Enter busy state (call before editing or dragging) */
157
+ enterBusy(): void;
158
+ /**
159
+ * Exit busy state and resolve any queued remote changes.
160
+ * Returns the merged result if a queue existed, null otherwise.
161
+ */
162
+ exitBusy(localBlocks: T[], strategy: 'merge' | 'lww'): T[] | null;
163
+ }
164
+ /**
165
+ * Imperative deferred sync factory for vanilla JS.
166
+ * Queues remote updates during blocking actions and resolves
167
+ * on exit using merge or last-write-wins strategy.
168
+ *
169
+ * @param options - Configuration including onResolve callback and merge options
170
+ * @returns DeferredSync instance with busy/queue/flush methods
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * const sync = createDeferredSync<MyBlock>({
175
+ * onResolve: (blocks) => controller.setBlocks(blocks),
176
+ * })
177
+ *
178
+ * // In your realtime subscription:
179
+ * socket.on('blocks', (blocks) => sync.apply(blocks))
180
+ *
181
+ * // Drag lifecycle:
182
+ * controller.on('drag:statechange', ({ isDragging }) => {
183
+ * if (isDragging) sync.enterBusy()
184
+ * else {
185
+ * const result = sync.exitBusy(controller.getBlocks(), 'lww')
186
+ * if (result) socket.emit('blocks', result)
187
+ * }
188
+ * })
189
+ * ```
190
+ */
191
+ declare function createDeferredSync<T extends BaseBlock>(options?: DeferredSyncOptions<T>): DeferredSync<T>;
192
+
145
193
  interface LayoutAnimationOptions {
146
194
  duration?: number;
147
195
  easing?: string;
@@ -311,4 +359,4 @@ declare function createDisposable(): Disposable & {
311
359
  add(fn: () => void): void;
312
360
  };
313
361
 
314
- export { type BlockHistory, type BlockHistoryOptions, type BlockRendererProps, type BlockRenderers, type BlockTreeController, type BlockTreeControllerOptions, type ContainerRendererProps, type ControllerEvents, type DefaultRenderer, type DefaultRendererOptions, type Disposable, DragOverlay, type DragOverlayOptions, type DragState, type InternalRenderers, KeyboardSensor, type KeyboardSensorCallbacks, LayoutAnimation, type LayoutAnimationOptions, PointerSensor, type PointerSensorOptions, type RenderBlockContext, type RendererPropsFor, type Sensor, type SensorCallbacks, TouchSensor, type TouchSensorOptions, type TreeRendererOptions, type Unsubscribe, type VanillaSensorConfig, type VirtualRange, VirtualScroller, type VirtualScrollerOptions, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
362
+ export { type BlockHistory, type BlockHistoryOptions, type BlockRendererProps, type BlockRenderers, type BlockTreeController, type BlockTreeControllerOptions, type ContainerRendererProps, type ControllerEvents, type DefaultRenderer, type DefaultRendererOptions, type DeferredSync, type DeferredSyncOptions, type Disposable, DragOverlay, type DragOverlayOptions, type DragState, type InternalRenderers, KeyboardSensor, type KeyboardSensorCallbacks, LayoutAnimation, type LayoutAnimationOptions, PointerSensor, type PointerSensorOptions, type RenderBlockContext, type RendererPropsFor, type Sensor, type SensorCallbacks, TouchSensor, type TouchSensorOptions, type TreeRendererOptions, type Unsubscribe, type VanillaSensorConfig, type VirtualRange, VirtualScroller, type VirtualScrollerOptions, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDeferredSync, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { BaseBlock, BlockRendererProps as BlockRendererProps$1, BlockRenderers as BlockRenderers$1, OrderingStrategy, CanDragFn, CanDropFn, IdGeneratorFn, SensorConfig, BlockTreeCallbacks, ContainerRendererProps as ContainerRendererProps$1, InternalRenderers as InternalRenderers$1, RendererPropsFor as RendererPropsFor$1, BlockTreeInstance, Rect, CollisionCandidate, CoreCollisionDetection } from '@dnd-block-tree/core';
2
- export { AnimationConfig, AutoExpandConfig, BaseBlock, BlockAction, BlockAddEvent, BlockDeleteEvent, BlockIndex, BlockMoveEvent, BlockPosition, BlockStateContextValue, BlockTreeCallbacks, BlockTreeConfig, BlockTreeCustomization, BlockTreeEvents, BlockTreeInstance, BlockTreeOptions, CanDragFn, CanDropFn, CollisionCandidate, CollisionResult, CoreCollisionDetection, DragEndEvent, DragMoveEvent, DragStartEvent, DropZoneConfig, DropZoneType, EventEmitter, ExpandAction, ExpandChangeEvent, HistoryAction, HistoryState, HoverChangeEvent, IdGeneratorFn, MoveOperation, NestedBlock, OrderingStrategy, Rect, SensorConfig, SnapshotRectsRef, TreeValidationResult, blockReducer, buildOrderedBlocks, cloneMap, cloneParentMap, closestCenterCollision, compareFractionalKeys, computeNormalizedIndex, createBlockTree, createStickyCollision, debounce, deleteBlockAndDescendants, expandReducer, extractBlockId, extractUUID, flatToNested, generateId, generateInitialKeys, generateKeyBetween, generateNKeysBetween, getBlockDepth, getDescendantIds, getDropZoneType, getSubtreeDepth, historyReducer, initFractionalOrder, nestedToFlat, reparentBlockIndex, reparentMultipleBlocks, validateBlockTree, weightedVerticalCollision } from '@dnd-block-tree/core';
1
+ import { BaseBlock, BlockRendererProps as BlockRendererProps$1, BlockRenderers as BlockRenderers$1, OrderingStrategy, CanDragFn, CanDropFn, IdGeneratorFn, SensorConfig, BlockTreeCallbacks, ContainerRendererProps as ContainerRendererProps$1, InternalRenderers as InternalRenderers$1, RendererPropsFor as RendererPropsFor$1, BlockTreeInstance, Rect, CollisionCandidate, CoreCollisionDetection, MergeBlockVersionsOptions } from '@dnd-block-tree/core';
2
+ export { AnimationConfig, AutoExpandConfig, BaseBlock, BlockAction, BlockAddEvent, BlockDeleteEvent, BlockIndex, BlockMoveEvent, BlockPosition, BlockStateContextValue, BlockTreeCallbacks, BlockTreeConfig, BlockTreeCustomization, BlockTreeEvents, BlockTreeInstance, BlockTreeOptions, CanDragFn, CanDropFn, CollisionCandidate, CollisionResult, CoreCollisionDetection, DragEndEvent, DragMoveEvent, DragStartEvent, DropZoneConfig, DropZoneType, EventEmitter, ExpandAction, ExpandChangeEvent, HistoryAction, HistoryState, HoverChangeEvent, IdGeneratorFn, MergeBlockVersionsOptions, MoveOperation, NestedBlock, OrderingStrategy, Rect, SensorConfig, SnapshotRectsRef, TreeValidationResult, blockReducer, buildOrderedBlocks, cloneMap, cloneParentMap, closestCenterCollision, compareFractionalKeys, computeNormalizedIndex, createBlockTree, createStickyCollision, debounce, deleteBlockAndDescendants, expandReducer, extractBlockId, extractUUID, flatToNested, generateId, generateInitialKeys, generateKeyBetween, generateNKeysBetween, getBlockDepth, getDescendantIds, getDropZoneType, getSubtreeDepth, historyReducer, initFractionalOrder, mergeBlockVersions, nestedToFlat, reparentBlockIndex, reparentMultipleBlocks, validateBlockTree, weightedVerticalCollision } from '@dnd-block-tree/core';
3
3
 
4
4
  type BlockRendererProps<T extends BaseBlock = BaseBlock> = BlockRendererProps$1<T, HTMLElement>;
5
5
  type ContainerRendererProps<T extends BaseBlock = BaseBlock> = ContainerRendererProps$1<T, HTMLElement>;
@@ -142,6 +142,54 @@ interface BlockHistory<T extends BaseBlock> {
142
142
  */
143
143
  declare function createBlockHistory<T extends BaseBlock>(initialBlocks: T[], options?: BlockHistoryOptions): BlockHistory<T>;
144
144
 
145
+ interface DeferredSyncOptions<T extends BaseBlock> {
146
+ /** Called when remote data is applied (only when not busy) */
147
+ onResolve?: (blocks: T[]) => void;
148
+ /** Options passed to mergeBlockVersions when using 'merge' strategy */
149
+ mergeOptions?: MergeBlockVersionsOptions;
150
+ }
151
+ interface DeferredSync<T extends BaseBlock> {
152
+ /** Whether sync is currently deferred */
153
+ isBusy(): boolean;
154
+ /** Apply remote blocks — queues if busy, calls onResolve if idle */
155
+ apply(remoteBlocks: T[]): void;
156
+ /** Enter busy state (call before editing or dragging) */
157
+ enterBusy(): void;
158
+ /**
159
+ * Exit busy state and resolve any queued remote changes.
160
+ * Returns the merged result if a queue existed, null otherwise.
161
+ */
162
+ exitBusy(localBlocks: T[], strategy: 'merge' | 'lww'): T[] | null;
163
+ }
164
+ /**
165
+ * Imperative deferred sync factory for vanilla JS.
166
+ * Queues remote updates during blocking actions and resolves
167
+ * on exit using merge or last-write-wins strategy.
168
+ *
169
+ * @param options - Configuration including onResolve callback and merge options
170
+ * @returns DeferredSync instance with busy/queue/flush methods
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * const sync = createDeferredSync<MyBlock>({
175
+ * onResolve: (blocks) => controller.setBlocks(blocks),
176
+ * })
177
+ *
178
+ * // In your realtime subscription:
179
+ * socket.on('blocks', (blocks) => sync.apply(blocks))
180
+ *
181
+ * // Drag lifecycle:
182
+ * controller.on('drag:statechange', ({ isDragging }) => {
183
+ * if (isDragging) sync.enterBusy()
184
+ * else {
185
+ * const result = sync.exitBusy(controller.getBlocks(), 'lww')
186
+ * if (result) socket.emit('blocks', result)
187
+ * }
188
+ * })
189
+ * ```
190
+ */
191
+ declare function createDeferredSync<T extends BaseBlock>(options?: DeferredSyncOptions<T>): DeferredSync<T>;
192
+
145
193
  interface LayoutAnimationOptions {
146
194
  duration?: number;
147
195
  easing?: string;
@@ -311,4 +359,4 @@ declare function createDisposable(): Disposable & {
311
359
  add(fn: () => void): void;
312
360
  };
313
361
 
314
- export { type BlockHistory, type BlockHistoryOptions, type BlockRendererProps, type BlockRenderers, type BlockTreeController, type BlockTreeControllerOptions, type ContainerRendererProps, type ControllerEvents, type DefaultRenderer, type DefaultRendererOptions, type Disposable, DragOverlay, type DragOverlayOptions, type DragState, type InternalRenderers, KeyboardSensor, type KeyboardSensorCallbacks, LayoutAnimation, type LayoutAnimationOptions, PointerSensor, type PointerSensorOptions, type RenderBlockContext, type RendererPropsFor, type Sensor, type SensorCallbacks, TouchSensor, type TouchSensorOptions, type TreeRendererOptions, type Unsubscribe, type VanillaSensorConfig, type VirtualRange, VirtualScroller, type VirtualScrollerOptions, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
362
+ export { type BlockHistory, type BlockHistoryOptions, type BlockRendererProps, type BlockRenderers, type BlockTreeController, type BlockTreeControllerOptions, type ContainerRendererProps, type ControllerEvents, type DefaultRenderer, type DefaultRendererOptions, type DeferredSync, type DeferredSyncOptions, type Disposable, DragOverlay, type DragOverlayOptions, type DragState, type InternalRenderers, KeyboardSensor, type KeyboardSensorCallbacks, LayoutAnimation, type LayoutAnimationOptions, PointerSensor, type PointerSensorOptions, type RenderBlockContext, type RendererPropsFor, type Sensor, type SensorCallbacks, TouchSensor, type TouchSensorOptions, type TreeRendererOptions, type Unsubscribe, type VanillaSensorConfig, type VirtualRange, VirtualScroller, type VirtualScrollerOptions, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDeferredSync, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
package/dist/index.js CHANGED
@@ -673,6 +673,33 @@ function createBlockTreeController(options = {}) {
673
673
  };
674
674
  return controller;
675
675
  }
676
+ function createDeferredSync(options) {
677
+ let busy = false;
678
+ let queue = null;
679
+ return {
680
+ isBusy: () => busy,
681
+ apply(remoteBlocks) {
682
+ if (busy) {
683
+ queue = remoteBlocks;
684
+ } else {
685
+ options?.onResolve?.(remoteBlocks);
686
+ }
687
+ },
688
+ enterBusy() {
689
+ busy = true;
690
+ },
691
+ exitBusy(localBlocks, strategy) {
692
+ busy = false;
693
+ const queued = queue;
694
+ queue = null;
695
+ if (!queued) return null;
696
+ if (strategy === "lww") {
697
+ return localBlocks;
698
+ }
699
+ return core.mergeBlockVersions(localBlocks, queued, options?.mergeOptions);
700
+ }
701
+ };
702
+ }
676
703
 
677
704
  // src/layout-animation.ts
678
705
  var LayoutAnimation = class {
@@ -988,6 +1015,10 @@ Object.defineProperty(exports, "initFractionalOrder", {
988
1015
  enumerable: true,
989
1016
  get: function () { return core.initFractionalOrder; }
990
1017
  });
1018
+ Object.defineProperty(exports, "mergeBlockVersions", {
1019
+ enumerable: true,
1020
+ get: function () { return core.mergeBlockVersions; }
1021
+ });
991
1022
  Object.defineProperty(exports, "nestedToFlat", {
992
1023
  enumerable: true,
993
1024
  get: function () { return core.nestedToFlat; }
@@ -1019,6 +1050,7 @@ exports.closestWithData = closestWithData;
1019
1050
  exports.createBlockHistory = createBlockHistory;
1020
1051
  exports.createBlockTreeController = createBlockTreeController;
1021
1052
  exports.createDefaultRenderer = createDefaultRenderer;
1053
+ exports.createDeferredSync = createDeferredSync;
1022
1054
  exports.createDisposable = createDisposable;
1023
1055
  exports.createDropZoneElement = createDropZoneElement;
1024
1056
  exports.createElement = createElement;
@@ -1030,5 +1062,3 @@ exports.renderTree = renderTree;
1030
1062
  exports.setDataAttributes = setDataAttributes;
1031
1063
  exports.setDropZoneActive = setDropZoneActive;
1032
1064
  exports.triggerHaptic = triggerHaptic;
1033
- //# sourceMappingURL=index.js.map
1034
- //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { historyReducer, createStickyCollision, createBlockTree, EventEmitter, getBlockDepth } from '@dnd-block-tree/core';
2
- export { EventEmitter, blockReducer, buildOrderedBlocks, cloneMap, cloneParentMap, closestCenterCollision, compareFractionalKeys, computeNormalizedIndex, createBlockTree, createStickyCollision, debounce, deleteBlockAndDescendants, expandReducer, extractBlockId, extractUUID, flatToNested, generateId, generateInitialKeys, generateKeyBetween, generateNKeysBetween, getBlockDepth, getDescendantIds, getDropZoneType, getSubtreeDepth, historyReducer, initFractionalOrder, nestedToFlat, reparentBlockIndex, reparentMultipleBlocks, validateBlockTree, weightedVerticalCollision } from '@dnd-block-tree/core';
1
+ import { historyReducer, createStickyCollision, createBlockTree, EventEmitter, mergeBlockVersions, getBlockDepth } from '@dnd-block-tree/core';
2
+ export { EventEmitter, blockReducer, buildOrderedBlocks, cloneMap, cloneParentMap, closestCenterCollision, compareFractionalKeys, computeNormalizedIndex, createBlockTree, createStickyCollision, debounce, deleteBlockAndDescendants, expandReducer, extractBlockId, extractUUID, flatToNested, generateId, generateInitialKeys, generateKeyBetween, generateNKeysBetween, getBlockDepth, getDescendantIds, getDropZoneType, getSubtreeDepth, historyReducer, initFractionalOrder, mergeBlockVersions, nestedToFlat, reparentBlockIndex, reparentMultipleBlocks, validateBlockTree, weightedVerticalCollision } from '@dnd-block-tree/core';
3
3
 
4
4
  // src/index.ts
5
5
 
@@ -672,6 +672,33 @@ function createBlockTreeController(options = {}) {
672
672
  };
673
673
  return controller;
674
674
  }
675
+ function createDeferredSync(options) {
676
+ let busy = false;
677
+ let queue = null;
678
+ return {
679
+ isBusy: () => busy,
680
+ apply(remoteBlocks) {
681
+ if (busy) {
682
+ queue = remoteBlocks;
683
+ } else {
684
+ options?.onResolve?.(remoteBlocks);
685
+ }
686
+ },
687
+ enterBusy() {
688
+ busy = true;
689
+ },
690
+ exitBusy(localBlocks, strategy) {
691
+ busy = false;
692
+ const queued = queue;
693
+ queue = null;
694
+ if (!queued) return null;
695
+ if (strategy === "lww") {
696
+ return localBlocks;
697
+ }
698
+ return mergeBlockVersions(localBlocks, queued, options?.mergeOptions);
699
+ }
700
+ };
701
+ }
675
702
 
676
703
  // src/layout-animation.ts
677
704
  var LayoutAnimation = class {
@@ -883,6 +910,4 @@ function createDisposable() {
883
910
  };
884
911
  }
885
912
 
886
- export { DragOverlay, KeyboardSensor, LayoutAnimation, PointerSensor, TouchSensor, VirtualScroller, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
887
- //# sourceMappingURL=index.mjs.map
888
- //# sourceMappingURL=index.mjs.map
913
+ export { DragOverlay, KeyboardSensor, LayoutAnimation, PointerSensor, TouchSensor, VirtualScroller, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDeferredSync, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dnd-block-tree/vanilla",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Vanilla JS/TS adapter for dnd-block-tree — zero framework dependencies",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -17,7 +17,9 @@
17
17
  }
18
18
  }
19
19
  },
20
- "files": ["dist"],
20
+ "files": [
21
+ "dist"
22
+ ],
21
23
  "scripts": {
22
24
  "build": "tsup",
23
25
  "dev": "tsup --watch",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/collision-bridge.ts","../src/drag-overlay.ts","../src/utils/dom.ts","../src/sensors/pointer-sensor.ts","../src/utils/haptic.ts","../src/sensors/touch-sensor.ts","../src/sensors/keyboard-sensor.ts","../src/history.ts","../src/controller.ts","../src/layout-animation.ts","../src/virtual-scroller.ts","../src/renderer/drop-zone.ts","../src/renderer/tree-renderer.ts","../src/renderer/default-renderer.ts","../src/renderer/ghost-preview.ts","../src/utils/disposable.ts"],"names":["historyReducer","createStickyCollision","createBlockTree","EventEmitter","getBlockDepth"],"mappings":"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","file":"index.js","sourcesContent":["import type { Rect, CollisionCandidate, CoreCollisionDetection } from '@dnd-block-tree/core'\n\n/**\n * Measure DOM rects for all registered drop zones and build CollisionCandidate[].\n * Snapshots rects once at drag start to prevent feedback loops.\n */\nexport function measureDropZoneRects(\n zones: Map<string, HTMLElement>\n): Map<string, Rect> {\n const rects = new Map<string, Rect>()\n for (const [id, el] of zones) {\n const domRect = el.getBoundingClientRect()\n rects.set(id, {\n top: domRect.top,\n left: domRect.left,\n width: domRect.width,\n height: domRect.height,\n right: domRect.right,\n bottom: domRect.bottom,\n })\n }\n return rects\n}\n\n/** Build collision candidates from a snapshot rect map */\nexport function buildCandidates(\n snapshotRects: Map<string, Rect>\n): CollisionCandidate[] {\n const candidates: CollisionCandidate[] = []\n for (const [id, rect] of snapshotRects) {\n candidates.push({ id, rect })\n }\n return candidates\n}\n\n/** Build a pointer rect from client coordinates */\nexport function pointerToRect(x: number, y: number): Rect {\n return {\n top: y,\n left: x,\n width: 1,\n height: 1,\n right: x + 1,\n bottom: y + 1,\n }\n}\n\n/** Run collision detection with snapshotted rects and pointer position */\nexport function detectCollision(\n detector: CoreCollisionDetection,\n snapshotRects: Map<string, Rect>,\n pointerX: number,\n pointerY: number\n): string | null {\n const candidates = buildCandidates(snapshotRects)\n const pointerRect = pointerToRect(pointerX, pointerY)\n const results = detector(candidates, pointerRect)\n return results.length > 0 ? results[0].id : null\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\n\nexport interface DragOverlayOptions {\n /** Custom renderer for the overlay content */\n renderOverlay?: (block: BaseBlock) => HTMLElement\n}\n\n/**\n * Floating drag overlay that follows the pointer during drag.\n * Creates and manages a fixed-position overlay element.\n */\nexport class DragOverlay {\n private overlay: HTMLElement | null = null\n private options: DragOverlayOptions\n\n constructor(options: DragOverlayOptions = {}) {\n this.options = options\n }\n\n show(block: BaseBlock, sourceEl: HTMLElement, x: number, y: number): void {\n this.hide()\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-drag-overlay', 'true')\n overlay.style.position = 'fixed'\n overlay.style.zIndex = '9999'\n overlay.style.pointerEvents = 'none'\n overlay.style.opacity = '0.7'\n overlay.style.backdropFilter = 'blur(4px)'\n overlay.style.willChange = 'transform'\n\n if (this.options.renderOverlay) {\n overlay.appendChild(this.options.renderOverlay(block))\n } else {\n // Default: clone the source element\n const rect = sourceEl.getBoundingClientRect()\n overlay.style.width = `${rect.width}px`\n const clone = sourceEl.cloneNode(true) as HTMLElement\n clone.style.margin = '0'\n overlay.appendChild(clone)\n }\n\n this.setPosition(overlay, x, y)\n document.body.appendChild(overlay)\n this.overlay = overlay\n }\n\n move(x: number, y: number): void {\n if (this.overlay) {\n this.setPosition(this.overlay, x, y)\n }\n }\n\n hide(): void {\n if (this.overlay) {\n this.overlay.remove()\n this.overlay = null\n }\n }\n\n private setPosition(el: HTMLElement, x: number, y: number): void {\n el.style.transform = `translate(${x}px, ${y}px)`\n }\n}\n","/** Create an element with attributes and optional children */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs?: Record<string, string>,\n children?: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n el.setAttribute(key, value)\n }\n }\n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n el.appendChild(document.createTextNode(child))\n } else {\n el.appendChild(child)\n }\n }\n }\n return el\n}\n\n/** Set data attributes from an object */\nexport function setDataAttributes(el: HTMLElement, data: Record<string, string | boolean | number>): void {\n for (const [key, value] of Object.entries(data)) {\n if (value === false) {\n el.removeAttribute(`data-${key}`)\n } else {\n el.setAttribute(`data-${key}`, String(value))\n }\n }\n}\n\n/** Find the closest ancestor with a given data attribute */\nexport function closestWithData(el: Element, dataAttr: string): HTMLElement | null {\n return el.closest(`[data-${dataAttr}]`) as HTMLElement | null\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\n\nexport interface PointerSensorOptions {\n activationDistance?: number\n}\n\nexport class PointerSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private activationDistance: number\n private isDragging = false\n private startX = 0\n private startY = 0\n private blockId: string | null = null\n\n private boundPointerDown: (e: PointerEvent) => void\n private boundPointerMove: (e: PointerEvent) => void\n private boundPointerUp: (e: PointerEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: PointerSensorOptions = {}) {\n this.callbacks = callbacks\n this.activationDistance = options.activationDistance ?? 8\n\n this.boundPointerDown = this.onPointerDown.bind(this)\n this.boundPointerMove = this.onPointerMove.bind(this)\n this.boundPointerUp = this.onPointerUp.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('pointerdown', this.boundPointerDown)\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('pointerdown', this.boundPointerDown)\n this.container = null\n }\n\n private onPointerDown(e: PointerEvent): void {\n // Only primary button\n if (e.button !== 0) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n this.startX = e.clientX\n this.startY = e.clientY\n this.isDragging = false\n\n document.addEventListener('pointermove', this.boundPointerMove)\n document.addEventListener('pointerup', this.boundPointerUp)\n }\n\n private onPointerMove(e: PointerEvent): void {\n const dx = e.clientX - this.startX\n const dy = e.clientY - this.startY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (!this.isDragging) {\n if (distance >= this.activationDistance) {\n this.isDragging = true\n this.callbacks.onDragStart(this.blockId!, this.startX, this.startY)\n }\n return\n }\n\n this.callbacks.onDragMove(e.clientX, e.clientY)\n }\n\n private onPointerUp(e: PointerEvent): void {\n if (this.isDragging) {\n this.callbacks.onDragEnd(e.clientX, e.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('pointermove', this.boundPointerMove)\n document.removeEventListener('pointerup', this.boundPointerUp)\n }\n}\n","/**\n * Trigger haptic feedback (vibration) on supported devices.\n * Safe to call in any environment -- no-ops when `navigator.vibrate` is unavailable.\n */\nexport function triggerHaptic(durationMs = 10): void {\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') {\n navigator.vibrate(durationMs)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\nimport { triggerHaptic } from '../utils/haptic'\n\nexport interface TouchSensorOptions {\n longPressDelay?: number\n hapticFeedback?: boolean\n}\n\nexport class TouchSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private longPressDelay: number\n private hapticFeedback: boolean\n private isDragging = false\n private pressTimer: ReturnType<typeof setTimeout> | null = null\n private blockId: string | null = null\n\n private boundTouchStart: (e: TouchEvent) => void\n private boundTouchMove: (e: TouchEvent) => void\n private boundTouchEnd: (e: TouchEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: TouchSensorOptions = {}) {\n this.callbacks = callbacks\n this.longPressDelay = options.longPressDelay ?? 200\n this.hapticFeedback = options.hapticFeedback ?? true\n\n this.boundTouchStart = this.onTouchStart.bind(this)\n this.boundTouchMove = this.onTouchMove.bind(this)\n this.boundTouchEnd = this.onTouchEnd.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('touchstart', this.boundTouchStart, { passive: false })\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('touchstart', this.boundTouchStart)\n this.container = null\n }\n\n private onTouchStart(e: TouchEvent): void {\n if (e.touches.length !== 1) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n const touch = e.touches[0]\n\n this.pressTimer = setTimeout(() => {\n this.isDragging = true\n if (this.hapticFeedback) triggerHaptic()\n this.callbacks.onDragStart(this.blockId!, touch.clientX, touch.clientY)\n }, this.longPressDelay)\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false })\n document.addEventListener('touchend', this.boundTouchEnd)\n document.addEventListener('touchcancel', this.boundTouchEnd)\n }\n\n private onTouchMove(e: TouchEvent): void {\n const touch = e.touches[0]\n\n if (!this.isDragging) {\n // Cancel long-press if finger moved before activation\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n this.cleanup()\n }\n return\n }\n\n e.preventDefault()\n this.callbacks.onDragMove(touch.clientX, touch.clientY)\n }\n\n private onTouchEnd(e: TouchEvent): void {\n if (this.isDragging) {\n const touch = e.changedTouches[0]\n this.callbacks.onDragEnd(touch.clientX, touch.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n }\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('touchmove', this.boundTouchMove)\n document.removeEventListener('touchend', this.boundTouchEnd)\n document.removeEventListener('touchcancel', this.boundTouchEnd)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\n\nexport interface KeyboardSensorCallbacks extends SensorCallbacks {\n onFocusPrev(): void\n onFocusNext(): void\n onExpand(): void\n onCollapse(): void\n onFocusFirst(): void\n onFocusLast(): void\n onToggleExpand(): void\n onSelect(): void\n}\n\nexport class KeyboardSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: KeyboardSensorCallbacks\n private boundKeyDown: (e: KeyboardEvent) => void\n\n constructor(callbacks: KeyboardSensorCallbacks) {\n this.callbacks = callbacks\n this.boundKeyDown = this.onKeyDown.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('keydown', this.boundKeyDown)\n }\n\n detach(): void {\n this.container?.removeEventListener('keydown', this.boundKeyDown)\n this.container = null\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n this.callbacks.onFocusPrev()\n break\n case 'ArrowDown':\n e.preventDefault()\n this.callbacks.onFocusNext()\n break\n case 'ArrowRight':\n e.preventDefault()\n this.callbacks.onExpand()\n break\n case 'ArrowLeft':\n e.preventDefault()\n this.callbacks.onCollapse()\n break\n case 'Home':\n e.preventDefault()\n this.callbacks.onFocusFirst()\n break\n case 'End':\n e.preventDefault()\n this.callbacks.onFocusLast()\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n this.callbacks.onToggleExpand()\n break\n case 'Escape':\n this.callbacks.onDragCancel()\n break\n }\n }\n}\n","import type { BaseBlock, HistoryState, HistoryAction } from '@dnd-block-tree/core'\nimport { historyReducer } from '@dnd-block-tree/core'\n\nexport interface BlockHistoryOptions {\n maxSteps?: number\n}\n\nexport interface BlockHistory<T extends BaseBlock> {\n push(blocks: T[]): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n getPresent(): T[]\n clear(blocks: T[]): void\n}\n\n/**\n * Imperative undo/redo history wrapping core's historyReducer.\n */\nexport function createBlockHistory<T extends BaseBlock>(\n initialBlocks: T[],\n options: BlockHistoryOptions = {}\n): BlockHistory<T> {\n const { maxSteps = 50 } = options\n\n let state: HistoryState<T> = {\n past: [],\n present: initialBlocks,\n future: [],\n }\n\n return {\n push(blocks: T[]) {\n state = historyReducer(state, { type: 'SET', payload: blocks, maxSteps })\n },\n\n undo(): T[] | null {\n if (state.past.length === 0) return null\n state = historyReducer(state, { type: 'UNDO' })\n return state.present\n },\n\n redo(): T[] | null {\n if (state.future.length === 0) return null\n state = historyReducer(state, { type: 'REDO' })\n return state.present\n },\n\n canUndo: () => state.past.length > 0,\n canRedo: () => state.future.length > 0,\n getPresent: () => state.present,\n\n clear(blocks: T[]) {\n state = { past: [], present: blocks, future: [] }\n },\n }\n}\n","import type {\n BaseBlock,\n BlockTreeInstance,\n CoreCollisionDetection,\n Rect,\n} from '@dnd-block-tree/core'\nimport {\n createBlockTree,\n createStickyCollision,\n EventEmitter,\n} from '@dnd-block-tree/core'\nimport type {\n BlockTreeControllerOptions,\n ControllerEvents,\n DragState,\n Unsubscribe,\n VanillaSensorConfig,\n} from './types'\nimport { measureDropZoneRects, detectCollision } from './collision-bridge'\nimport { DragOverlay } from './drag-overlay'\nimport { PointerSensor } from './sensors/pointer-sensor'\nimport { TouchSensor } from './sensors/touch-sensor'\nimport { KeyboardSensor } from './sensors/keyboard-sensor'\nimport type { SensorCallbacks } from './sensors/types'\nimport type { Sensor } from './sensors/types'\nimport { createBlockHistory, type BlockHistory } from './history'\n\nexport interface BlockTreeController<T extends BaseBlock = BaseBlock> {\n // Mounting\n mount(container: HTMLElement): void\n unmount(): void\n\n // Registration\n registerDraggable(id: string, element: HTMLElement): Unsubscribe\n registerDropZone(id: string, element: HTMLElement): Unsubscribe\n\n // State reads\n getDragState(): DragState\n getBlocks(): T[]\n getEffectiveBlocks(): T[]\n getExpandedMap(): Record<string, boolean>\n getBlock(id: string): T | undefined\n\n // Actions\n toggleExpand(id: string): void\n setExpandAll(expanded: boolean): void\n addBlock(type: T['type'], parentId?: string | null): T\n deleteBlock(id: string): void\n setBlocks(blocks: T[]): void\n\n // Selection\n select(id: string, mode: 'single' | 'toggle' | 'range'): void\n clearSelection(): void\n getSelectedIds(): Set<string>\n\n // History (opt-in)\n enableHistory(maxSteps?: number): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n\n // Events\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe\n\n // Overlay\n setOverlayRenderer(render: (block: T) => HTMLElement): void\n\n // Tree instance (escape hatch)\n getTree(): BlockTreeInstance<T>\n\n // Cleanup\n destroy(): void\n}\n\nexport function createBlockTreeController<T extends BaseBlock>(\n options: BlockTreeControllerOptions<T> = {}\n): BlockTreeController<T> {\n const {\n initialBlocks = [],\n containerTypes = [],\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n sensors: sensorConfig,\n onChange,\n callbacks,\n } = options\n\n // Core tree instance\n const stickyCollision = createStickyCollision(15)\n const tree = createBlockTree<T>({\n initialBlocks,\n containerTypes,\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n collisionDetection: stickyCollision,\n })\n\n // Emitter for controller-level events\n const emitter = new EventEmitter<ControllerEvents<T>>()\n\n // DOM state\n let container: HTMLElement | null = null\n const draggableElements = new Map<string, HTMLElement>()\n const dropZoneElements = new Map<string, HTMLElement>()\n let snapshotRects: Map<string, Rect> | null = null\n\n // Selection state\n const selectedIds = new Set<string>()\n let lastSelectedId: string | null = null\n\n // Sensors\n const activeSensors: Sensor[] = []\n\n // Overlay\n const overlay = new DragOverlay()\n let overlayRenderer: ((block: T) => HTMLElement) | null = null\n\n // History (opt-in)\n let history: BlockHistory<T> | null = null\n\n // Wire core tree events to callbacks and controller emitter\n tree.on('blocks:change', (blocks) => {\n onChange?.(blocks as T[])\n if (history) {\n history.push(blocks as T[])\n }\n emitter.emit('render', blocks as T[], tree.getExpandedMap())\n })\n tree.on('expand:change', () => {\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n })\n if (callbacks?.onDragStart) {\n tree.on('drag:start', (e) => callbacks.onDragStart!(e as any))\n }\n if (callbacks?.onDragEnd) {\n tree.on('drag:end', (e) => callbacks.onDragEnd!(e as any))\n }\n if (callbacks?.onBlockAdd) {\n tree.on('block:add', (e) => callbacks.onBlockAdd!(e as any))\n }\n if (callbacks?.onBlockDelete) {\n tree.on('block:delete', (e) => callbacks.onBlockDelete!(e as any))\n }\n if (callbacks?.onExpandChange) {\n tree.on('expand:change', (e) => callbacks.onExpandChange!(e as any))\n }\n if (callbacks?.onHoverChange) {\n tree.on('hover:change', (e) => callbacks.onHoverChange!(e as any))\n }\n\n // Sensor callbacks\n const sensorCallbacks: SensorCallbacks = {\n onDragStart(blockId: string, x: number, y: number) {\n const draggedIds = selectedIds.has(blockId) && selectedIds.size > 1\n ? [...selectedIds]\n : [blockId]\n\n const started = tree.startDrag(blockId, draggedIds)\n if (!started) return\n\n stickyCollision.reset()\n snapshotRects = measureDropZoneRects(dropZoneElements)\n\n // Show overlay\n const block = tree.getBlock(blockId)\n const el = draggableElements.get(blockId)\n if (block && el) {\n if (overlayRenderer) {\n overlay.show(block, el, x, y)\n } else {\n overlay.show(block, el, x, y)\n }\n }\n\n emitter.emit('drag:statechange', getDragState())\n },\n\n onDragMove(x: number, y: number) {\n if (!snapshotRects) return\n\n overlay.move(x, y)\n\n const detector = tree.getCollisionDetection()\n if (!detector) return\n\n const targetZone = detectCollision(detector, snapshotRects, x, y)\n if (targetZone) {\n tree.updateDrag(targetZone)\n }\n },\n\n onDragEnd(_x: number, _y: number) {\n const result = tree.endDrag()\n overlay.hide()\n snapshotRects = null\n\n if (result && callbacks?.onBlockMove) {\n // Fire block move callback\n callbacks.onBlockMove({\n block: tree.getBlock(tree.getBlocks()[0]?.id) as any,\n from: { parentId: null, index: 0 },\n to: { parentId: null, index: 0 },\n blocks: result.blocks as T[],\n movedIds: [],\n })\n }\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n onDragCancel() {\n tree.cancelDrag()\n overlay.hide()\n snapshotRects = null\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n }\n\n function getDragState(): DragState {\n return {\n isDragging: tree.getActiveId() !== null,\n activeId: tree.getActiveId(),\n hoverZone: tree.getHoverZone(),\n }\n }\n\n function setupSensors(): void {\n const config: VanillaSensorConfig = sensorConfig ?? {}\n if (!container) return\n\n if (config.pointer !== false) {\n const pointer = new PointerSensor(sensorCallbacks, {\n activationDistance: config.activationDistance,\n })\n pointer.attach(container)\n activeSensors.push(pointer)\n }\n\n if (config.touch !== false) {\n const touch = new TouchSensor(sensorCallbacks, {\n longPressDelay: config.longPressDelay,\n hapticFeedback: config.hapticFeedback,\n })\n touch.attach(container)\n activeSensors.push(touch)\n }\n\n if (config.keyboard) {\n const visibleBlocks = () => tree.getEffectiveBlocks()\n let focusedIndex = -1\n\n const keyboard = new KeyboardSensor({\n ...sensorCallbacks,\n onFocusPrev() {\n const blocks = visibleBlocks()\n focusedIndex = Math.max(0, focusedIndex - 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onFocusNext() {\n const blocks = visibleBlocks()\n focusedIndex = Math.min(blocks.length - 1, focusedIndex + 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && !tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onCollapse() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onFocusFirst() {\n focusedIndex = 0\n const blocks = visibleBlocks()\n if (blocks[0]) focusDraggable(blocks[0].id)\n },\n onFocusLast() {\n const blocks = visibleBlocks()\n focusedIndex = blocks.length - 1\n if (blocks[focusedIndex]) focusDraggable(blocks[focusedIndex].id)\n },\n onToggleExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type)) {\n tree.toggleExpand(block.id)\n }\n },\n onSelect() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block) {\n controller.select(block.id, 'toggle')\n }\n },\n })\n keyboard.attach(container)\n activeSensors.push(keyboard)\n }\n }\n\n function focusDraggable(id: string): void {\n const el = draggableElements.get(id)\n if (el) el.focus()\n }\n\n function teardownSensors(): void {\n for (const sensor of activeSensors) {\n sensor.detach()\n }\n activeSensors.length = 0\n }\n\n const controller: BlockTreeController<T> = {\n mount(el: HTMLElement) {\n container = el\n setupSensors()\n // Initial render\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n unmount() {\n teardownSensors()\n overlay.hide()\n container = null\n },\n\n registerDraggable(id: string, element: HTMLElement) {\n element.setAttribute('data-draggable-id', id)\n element.setAttribute('data-block-id', id)\n draggableElements.set(id, element)\n return () => {\n draggableElements.delete(id)\n }\n },\n\n registerDropZone(id: string, element: HTMLElement) {\n element.setAttribute('data-zone-id', id)\n dropZoneElements.set(id, element)\n return () => {\n dropZoneElements.delete(id)\n }\n },\n\n getDragState,\n getBlocks: () => tree.getBlocks(),\n getEffectiveBlocks: () => tree.getEffectiveBlocks(),\n getExpandedMap: () => tree.getExpandedMap(),\n getBlock: (id) => tree.getBlock(id),\n\n toggleExpand(id: string) {\n tree.toggleExpand(id)\n },\n\n setExpandAll(expanded: boolean) {\n tree.setExpandAll(expanded)\n },\n\n addBlock(type, parentId = null) {\n return tree.addBlock(type, parentId)\n },\n\n deleteBlock(id: string) {\n tree.deleteBlock(id)\n },\n\n setBlocks(blocks: T[]) {\n tree.setBlocks(blocks)\n },\n\n select(id: string, mode: 'single' | 'toggle' | 'range') {\n if (mode === 'single') {\n selectedIds.clear()\n selectedIds.add(id)\n } else if (mode === 'toggle') {\n if (selectedIds.has(id)) {\n selectedIds.delete(id)\n } else {\n selectedIds.add(id)\n }\n } else if (mode === 'range' && lastSelectedId) {\n const blocks = tree.getBlocks()\n const startIdx = blocks.findIndex(b => b.id === lastSelectedId)\n const endIdx = blocks.findIndex(b => b.id === id)\n if (startIdx !== -1 && endIdx !== -1) {\n const [from, to] = startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx]\n for (let i = from; i <= to; i++) {\n selectedIds.add(blocks[i].id)\n }\n }\n }\n lastSelectedId = id\n emitter.emit('selection:change', new Set(selectedIds))\n },\n\n clearSelection() {\n selectedIds.clear()\n lastSelectedId = null\n emitter.emit('selection:change', new Set())\n },\n\n getSelectedIds: () => new Set(selectedIds),\n\n enableHistory(maxSteps = 50) {\n history = createBlockHistory(tree.getBlocks(), { maxSteps })\n },\n\n undo() {\n if (!history) return null\n const blocks = history.undo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n redo() {\n if (!history) return null\n const blocks = history.redo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n canUndo: () => history?.canUndo() ?? false,\n canRedo: () => history?.canRedo() ?? false,\n\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe {\n return emitter.on(event, handler)\n },\n\n setOverlayRenderer(render: (block: T) => HTMLElement) {\n overlayRenderer = render\n },\n\n getTree: () => tree,\n\n destroy() {\n teardownSensors()\n overlay.hide()\n tree.destroy()\n emitter.removeAllListeners()\n draggableElements.clear()\n dropZoneElements.clear()\n selectedIds.clear()\n },\n }\n\n return controller\n}\n","import type { Rect } from '@dnd-block-tree/core'\n\nexport interface LayoutAnimationOptions {\n duration?: number\n easing?: string\n}\n\n/**\n * FLIP animation for block layout changes.\n * Records element positions before a DOM update, then animates from old to new.\n */\nexport class LayoutAnimation {\n private duration: number\n private easing: string\n private snapshots = new Map<string, DOMRect>()\n\n constructor(options: LayoutAnimationOptions = {}) {\n this.duration = options.duration ?? 200\n this.easing = options.easing ?? 'ease'\n }\n\n /** Record current positions of all block elements in a container */\n snapshot(container: HTMLElement): void {\n this.snapshots.clear()\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (id) {\n this.snapshots.set(id, el.getBoundingClientRect())\n }\n }\n }\n\n /** After DOM update, animate elements from old to new positions */\n animate(container: HTMLElement): void {\n if (this.snapshots.size === 0) return\n\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (!id) continue\n\n const oldRect = this.snapshots.get(id)\n if (!oldRect) continue\n\n const newRect = el.getBoundingClientRect()\n\n const deltaX = oldRect.left - newRect.left\n const deltaY = oldRect.top - newRect.top\n\n if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) continue\n\n el.style.transform = `translate(${deltaX}px, ${deltaY}px)`\n el.style.transition = 'none'\n\n requestAnimationFrame(() => {\n el.style.transition = `transform ${this.duration}ms ${this.easing}`\n el.style.transform = ''\n\n const onEnd = () => {\n el.style.transition = ''\n el.removeEventListener('transitionend', onEnd)\n }\n el.addEventListener('transitionend', onEnd, { once: true })\n })\n }\n\n this.snapshots.clear()\n }\n}\n","export interface VirtualScrollerOptions {\n itemHeight: number\n overscan?: number\n}\n\nexport interface VirtualRange {\n startIndex: number\n endIndex: number\n offsetY: number\n totalHeight: number\n visibleIds: Set<string>\n}\n\n/**\n * Virtual scrolling for large trees.\n * Calculates visible range based on scroll position and viewport height.\n */\nexport class VirtualScroller {\n private itemHeight: number\n private overscan: number\n\n constructor(options: VirtualScrollerOptions) {\n this.itemHeight = options.itemHeight\n this.overscan = options.overscan ?? 5\n }\n\n /** Calculate the visible range for a given scroll state */\n calculate(\n scrollTop: number,\n viewportHeight: number,\n totalItems: number,\n blockIds: string[]\n ): VirtualRange {\n const startIndex = Math.max(0, Math.floor(scrollTop / this.itemHeight) - this.overscan)\n const visibleCount = Math.ceil(viewportHeight / this.itemHeight) + 2 * this.overscan\n const endIndex = Math.min(totalItems, startIndex + visibleCount)\n\n const visibleIds = new Set<string>()\n for (let i = startIndex; i < endIndex && i < blockIds.length; i++) {\n visibleIds.add(blockIds[i])\n }\n\n return {\n startIndex,\n endIndex,\n offsetY: startIndex * this.itemHeight,\n totalHeight: totalItems * this.itemHeight,\n visibleIds,\n }\n }\n}\n","import { createElement, setDataAttributes } from '../utils/dom'\n\nexport interface DropZoneOptions {\n id: string\n height?: number\n}\n\nexport function createDropZoneElement(options: DropZoneOptions): HTMLElement {\n const { id, height = 4 } = options\n const el = createElement('div')\n setDataAttributes(el, {\n 'zone-id': id,\n })\n el.style.height = `${height}px`\n el.style.minHeight = `${height}px`\n el.style.transition = 'background-color 150ms ease'\n return el\n}\n\nexport function setDropZoneActive(el: HTMLElement, active: boolean): void {\n setDataAttributes(el, { 'zone-active': active })\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport { getBlockDepth } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { RenderBlockContext } from '../types'\nimport { createElement, setDataAttributes } from '../utils/dom'\nimport { createDropZoneElement, setDropZoneActive } from './drop-zone'\n\nexport interface TreeRendererOptions<T extends BaseBlock> {\n renderBlock: (block: T, ctx: RenderBlockContext) => HTMLElement\n containerTypes: readonly string[]\n dropZoneHeight?: number\n}\n\n/**\n * Recursive DOM tree builder. Creates the full tree DOM from blocks.\n * Keyed by data-block-id for efficient reconciliation.\n */\nexport function renderTree<T extends BaseBlock>(\n blocks: T[],\n expandedMap: Record<string, boolean>,\n controller: BlockTreeController<T>,\n options: TreeRendererOptions<T>,\n parentId: string | null = null,\n depth = 0\n): HTMLElement {\n const { renderBlock, containerTypes, dropZoneHeight } = options\n\n const container = createElement('div', {\n role: parentId === null ? 'tree' : 'group',\n })\n if (parentId === null) {\n container.setAttribute('data-dnd-tree-root', 'true')\n }\n\n const children = blocks.filter(b => b.parentId === parentId)\n const activeId = controller.getDragState().activeId\n const selectedIds = controller.getSelectedIds()\n const index = controller.getTree().getBlockIndex()\n\n // Start zone for container\n if (parentId !== null) {\n const startZone = createDropZoneElement({ id: `into-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`into-${parentId}`, startZone)\n container.appendChild(startZone)\n } else {\n const rootStart = createDropZoneElement({ id: 'root-start', height: dropZoneHeight })\n controller.registerDropZone('root-start', rootStart)\n container.appendChild(rootStart)\n }\n\n for (const block of children) {\n // Skip actively dragged block (rendered in overlay)\n if (block.id === activeId) continue\n\n // Before zone\n const beforeZone = createDropZoneElement({ id: `before-${block.id}`, height: dropZoneHeight })\n controller.registerDropZone(`before-${block.id}`, beforeZone)\n container.appendChild(beforeZone)\n\n const isContainer = containerTypes.includes(block.type)\n const isExpanded = expandedMap[block.id] !== false\n const blockDepth = getBlockDepth(index, block.id)\n\n // Build children for containers\n let childrenEl: HTMLElement | null = null\n if (isContainer && isExpanded) {\n childrenEl = renderTree(blocks, expandedMap, controller, options, block.id, depth + 1)\n }\n\n const ctx: RenderBlockContext = {\n children: childrenEl,\n depth: blockDepth,\n isExpanded,\n isDragging: block.id === activeId,\n isSelected: selectedIds.has(block.id),\n onToggleExpand: isContainer ? () => controller.toggleExpand(block.id) : null,\n }\n\n const blockEl = renderBlock(block, ctx)\n setDataAttributes(blockEl, {\n 'block-id': block.id,\n 'block-type': block.type,\n depth: String(blockDepth),\n dragging: block.id === activeId,\n selected: selectedIds.has(block.id),\n })\n\n // Register as draggable\n controller.registerDraggable(block.id, blockEl)\n\n // ARIA attributes\n blockEl.setAttribute('role', 'treeitem')\n blockEl.setAttribute('aria-level', String(blockDepth + 1))\n if (isContainer) {\n blockEl.setAttribute('aria-expanded', String(isExpanded))\n }\n blockEl.setAttribute('tabindex', '-1')\n\n container.appendChild(blockEl)\n }\n\n // End zone\n if (parentId !== null) {\n const endZone = createDropZoneElement({ id: `end-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`end-${parentId}`, endZone)\n container.appendChild(endZone)\n } else {\n const rootEnd = createDropZoneElement({ id: 'root-end', height: dropZoneHeight })\n controller.registerDropZone('root-end', rootEnd)\n container.appendChild(rootEnd)\n }\n\n return container\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { DefaultRendererOptions, Unsubscribe, RenderBlockContext } from '../types'\nimport { renderTree } from './tree-renderer'\n\nexport interface DefaultRenderer extends Unsubscribe {\n /** Force a re-render */\n refresh(): void\n}\n\n/**\n * DefaultRenderer (Layer 2): Subscribes to controller events and\n * automatically creates/updates DOM. User provides a renderBlock function.\n */\nexport function createDefaultRenderer<T extends BaseBlock>(\n controller: BlockTreeController<T>,\n options: DefaultRendererOptions<T>\n): DefaultRenderer {\n const { container, renderBlock, dropZoneHeight, animateExpand } = options\n const containerTypes = (controller.getTree() as any).containerTypes ?? []\n\n function render(blocks: T[], expandedMap: Record<string, boolean>): void {\n // Clear existing DOM\n container.innerHTML = ''\n\n // Build fresh tree DOM\n const tree = renderTree(blocks, expandedMap, controller, {\n renderBlock,\n containerTypes,\n dropZoneHeight,\n })\n\n container.appendChild(tree)\n }\n\n // Subscribe to render events\n const unsubRender = controller.on('render', render)\n\n // Initial render\n render(controller.getBlocks(), controller.getExpandedMap())\n\n const renderer: DefaultRenderer = () => {\n unsubRender()\n }\n renderer.refresh = () => {\n render(controller.getBlocks(), controller.getExpandedMap())\n }\n\n return renderer\n}\n","import { setDataAttributes } from '../utils/dom'\n\n/** Create a semi-transparent in-flow preview of a block at its target position */\nexport function createGhostPreview(sourceEl: HTMLElement): HTMLElement {\n const ghost = sourceEl.cloneNode(true) as HTMLElement\n setDataAttributes(ghost, { 'dnd-ghost': 'true' })\n ghost.style.opacity = '0.3'\n ghost.style.pointerEvents = 'none'\n ghost.removeAttribute('data-draggable-id')\n ghost.removeAttribute('data-block-id')\n return ghost\n}\n","import type { Disposable } from '../types'\n\n/** Collect multiple cleanup functions into a single disposable */\nexport function createDisposable(): Disposable & { add(fn: () => void): void } {\n const cleanups: (() => void)[] = []\n\n return {\n add(fn: () => void) {\n cleanups.push(fn)\n },\n dispose() {\n for (const fn of cleanups.reverse()) {\n fn()\n }\n cleanups.length = 0\n },\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/collision-bridge.ts","../src/drag-overlay.ts","../src/utils/dom.ts","../src/sensors/pointer-sensor.ts","../src/utils/haptic.ts","../src/sensors/touch-sensor.ts","../src/sensors/keyboard-sensor.ts","../src/history.ts","../src/controller.ts","../src/layout-animation.ts","../src/virtual-scroller.ts","../src/renderer/drop-zone.ts","../src/renderer/tree-renderer.ts","../src/renderer/default-renderer.ts","../src/renderer/ghost-preview.ts","../src/utils/disposable.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Rect, CollisionCandidate, CoreCollisionDetection } from '@dnd-block-tree/core'\n\n/**\n * Measure DOM rects for all registered drop zones and build CollisionCandidate[].\n * Snapshots rects once at drag start to prevent feedback loops.\n */\nexport function measureDropZoneRects(\n zones: Map<string, HTMLElement>\n): Map<string, Rect> {\n const rects = new Map<string, Rect>()\n for (const [id, el] of zones) {\n const domRect = el.getBoundingClientRect()\n rects.set(id, {\n top: domRect.top,\n left: domRect.left,\n width: domRect.width,\n height: domRect.height,\n right: domRect.right,\n bottom: domRect.bottom,\n })\n }\n return rects\n}\n\n/** Build collision candidates from a snapshot rect map */\nexport function buildCandidates(\n snapshotRects: Map<string, Rect>\n): CollisionCandidate[] {\n const candidates: CollisionCandidate[] = []\n for (const [id, rect] of snapshotRects) {\n candidates.push({ id, rect })\n }\n return candidates\n}\n\n/** Build a pointer rect from client coordinates */\nexport function pointerToRect(x: number, y: number): Rect {\n return {\n top: y,\n left: x,\n width: 1,\n height: 1,\n right: x + 1,\n bottom: y + 1,\n }\n}\n\n/** Run collision detection with snapshotted rects and pointer position */\nexport function detectCollision(\n detector: CoreCollisionDetection,\n snapshotRects: Map<string, Rect>,\n pointerX: number,\n pointerY: number\n): string | null {\n const candidates = buildCandidates(snapshotRects)\n const pointerRect = pointerToRect(pointerX, pointerY)\n const results = detector(candidates, pointerRect)\n return results.length > 0 ? results[0].id : null\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\n\nexport interface DragOverlayOptions {\n /** Custom renderer for the overlay content */\n renderOverlay?: (block: BaseBlock) => HTMLElement\n}\n\n/**\n * Floating drag overlay that follows the pointer during drag.\n * Creates and manages a fixed-position overlay element.\n */\nexport class DragOverlay {\n private overlay: HTMLElement | null = null\n private options: DragOverlayOptions\n\n constructor(options: DragOverlayOptions = {}) {\n this.options = options\n }\n\n show(block: BaseBlock, sourceEl: HTMLElement, x: number, y: number): void {\n this.hide()\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-drag-overlay', 'true')\n overlay.style.position = 'fixed'\n overlay.style.zIndex = '9999'\n overlay.style.pointerEvents = 'none'\n overlay.style.opacity = '0.7'\n overlay.style.backdropFilter = 'blur(4px)'\n overlay.style.willChange = 'transform'\n\n if (this.options.renderOverlay) {\n overlay.appendChild(this.options.renderOverlay(block))\n } else {\n // Default: clone the source element\n const rect = sourceEl.getBoundingClientRect()\n overlay.style.width = `${rect.width}px`\n const clone = sourceEl.cloneNode(true) as HTMLElement\n clone.style.margin = '0'\n overlay.appendChild(clone)\n }\n\n this.setPosition(overlay, x, y)\n document.body.appendChild(overlay)\n this.overlay = overlay\n }\n\n move(x: number, y: number): void {\n if (this.overlay) {\n this.setPosition(this.overlay, x, y)\n }\n }\n\n hide(): void {\n if (this.overlay) {\n this.overlay.remove()\n this.overlay = null\n }\n }\n\n private setPosition(el: HTMLElement, x: number, y: number): void {\n el.style.transform = `translate(${x}px, ${y}px)`\n }\n}\n","/** Create an element with attributes and optional children */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs?: Record<string, string>,\n children?: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n el.setAttribute(key, value)\n }\n }\n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n el.appendChild(document.createTextNode(child))\n } else {\n el.appendChild(child)\n }\n }\n }\n return el\n}\n\n/** Set data attributes from an object */\nexport function setDataAttributes(el: HTMLElement, data: Record<string, string | boolean | number>): void {\n for (const [key, value] of Object.entries(data)) {\n if (value === false) {\n el.removeAttribute(`data-${key}`)\n } else {\n el.setAttribute(`data-${key}`, String(value))\n }\n }\n}\n\n/** Find the closest ancestor with a given data attribute */\nexport function closestWithData(el: Element, dataAttr: string): HTMLElement | null {\n return el.closest(`[data-${dataAttr}]`) as HTMLElement | null\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\n\nexport interface PointerSensorOptions {\n activationDistance?: number\n}\n\nexport class PointerSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private activationDistance: number\n private isDragging = false\n private startX = 0\n private startY = 0\n private blockId: string | null = null\n\n private boundPointerDown: (e: PointerEvent) => void\n private boundPointerMove: (e: PointerEvent) => void\n private boundPointerUp: (e: PointerEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: PointerSensorOptions = {}) {\n this.callbacks = callbacks\n this.activationDistance = options.activationDistance ?? 8\n\n this.boundPointerDown = this.onPointerDown.bind(this)\n this.boundPointerMove = this.onPointerMove.bind(this)\n this.boundPointerUp = this.onPointerUp.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('pointerdown', this.boundPointerDown)\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('pointerdown', this.boundPointerDown)\n this.container = null\n }\n\n private onPointerDown(e: PointerEvent): void {\n // Only primary button\n if (e.button !== 0) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n this.startX = e.clientX\n this.startY = e.clientY\n this.isDragging = false\n\n document.addEventListener('pointermove', this.boundPointerMove)\n document.addEventListener('pointerup', this.boundPointerUp)\n }\n\n private onPointerMove(e: PointerEvent): void {\n const dx = e.clientX - this.startX\n const dy = e.clientY - this.startY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (!this.isDragging) {\n if (distance >= this.activationDistance) {\n this.isDragging = true\n this.callbacks.onDragStart(this.blockId!, this.startX, this.startY)\n }\n return\n }\n\n this.callbacks.onDragMove(e.clientX, e.clientY)\n }\n\n private onPointerUp(e: PointerEvent): void {\n if (this.isDragging) {\n this.callbacks.onDragEnd(e.clientX, e.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('pointermove', this.boundPointerMove)\n document.removeEventListener('pointerup', this.boundPointerUp)\n }\n}\n","/**\n * Trigger haptic feedback (vibration) on supported devices.\n * Safe to call in any environment -- no-ops when `navigator.vibrate` is unavailable.\n */\nexport function triggerHaptic(durationMs = 10): void {\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') {\n navigator.vibrate(durationMs)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\nimport { triggerHaptic } from '../utils/haptic'\n\nexport interface TouchSensorOptions {\n longPressDelay?: number\n hapticFeedback?: boolean\n}\n\nexport class TouchSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private longPressDelay: number\n private hapticFeedback: boolean\n private isDragging = false\n private pressTimer: ReturnType<typeof setTimeout> | null = null\n private blockId: string | null = null\n\n private boundTouchStart: (e: TouchEvent) => void\n private boundTouchMove: (e: TouchEvent) => void\n private boundTouchEnd: (e: TouchEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: TouchSensorOptions = {}) {\n this.callbacks = callbacks\n this.longPressDelay = options.longPressDelay ?? 200\n this.hapticFeedback = options.hapticFeedback ?? true\n\n this.boundTouchStart = this.onTouchStart.bind(this)\n this.boundTouchMove = this.onTouchMove.bind(this)\n this.boundTouchEnd = this.onTouchEnd.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('touchstart', this.boundTouchStart, { passive: false })\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('touchstart', this.boundTouchStart)\n this.container = null\n }\n\n private onTouchStart(e: TouchEvent): void {\n if (e.touches.length !== 1) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n const touch = e.touches[0]\n\n this.pressTimer = setTimeout(() => {\n this.isDragging = true\n if (this.hapticFeedback) triggerHaptic()\n this.callbacks.onDragStart(this.blockId!, touch.clientX, touch.clientY)\n }, this.longPressDelay)\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false })\n document.addEventListener('touchend', this.boundTouchEnd)\n document.addEventListener('touchcancel', this.boundTouchEnd)\n }\n\n private onTouchMove(e: TouchEvent): void {\n const touch = e.touches[0]\n\n if (!this.isDragging) {\n // Cancel long-press if finger moved before activation\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n this.cleanup()\n }\n return\n }\n\n e.preventDefault()\n this.callbacks.onDragMove(touch.clientX, touch.clientY)\n }\n\n private onTouchEnd(e: TouchEvent): void {\n if (this.isDragging) {\n const touch = e.changedTouches[0]\n this.callbacks.onDragEnd(touch.clientX, touch.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n }\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('touchmove', this.boundTouchMove)\n document.removeEventListener('touchend', this.boundTouchEnd)\n document.removeEventListener('touchcancel', this.boundTouchEnd)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\n\nexport interface KeyboardSensorCallbacks extends SensorCallbacks {\n onFocusPrev(): void\n onFocusNext(): void\n onExpand(): void\n onCollapse(): void\n onFocusFirst(): void\n onFocusLast(): void\n onToggleExpand(): void\n onSelect(): void\n}\n\nexport class KeyboardSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: KeyboardSensorCallbacks\n private boundKeyDown: (e: KeyboardEvent) => void\n\n constructor(callbacks: KeyboardSensorCallbacks) {\n this.callbacks = callbacks\n this.boundKeyDown = this.onKeyDown.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('keydown', this.boundKeyDown)\n }\n\n detach(): void {\n this.container?.removeEventListener('keydown', this.boundKeyDown)\n this.container = null\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n this.callbacks.onFocusPrev()\n break\n case 'ArrowDown':\n e.preventDefault()\n this.callbacks.onFocusNext()\n break\n case 'ArrowRight':\n e.preventDefault()\n this.callbacks.onExpand()\n break\n case 'ArrowLeft':\n e.preventDefault()\n this.callbacks.onCollapse()\n break\n case 'Home':\n e.preventDefault()\n this.callbacks.onFocusFirst()\n break\n case 'End':\n e.preventDefault()\n this.callbacks.onFocusLast()\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n this.callbacks.onToggleExpand()\n break\n case 'Escape':\n this.callbacks.onDragCancel()\n break\n }\n }\n}\n","import type { BaseBlock, HistoryState, HistoryAction } from '@dnd-block-tree/core'\nimport { historyReducer } from '@dnd-block-tree/core'\n\nexport interface BlockHistoryOptions {\n maxSteps?: number\n}\n\nexport interface BlockHistory<T extends BaseBlock> {\n push(blocks: T[]): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n getPresent(): T[]\n clear(blocks: T[]): void\n}\n\n/**\n * Imperative undo/redo history wrapping core's historyReducer.\n */\nexport function createBlockHistory<T extends BaseBlock>(\n initialBlocks: T[],\n options: BlockHistoryOptions = {}\n): BlockHistory<T> {\n const { maxSteps = 50 } = options\n\n let state: HistoryState<T> = {\n past: [],\n present: initialBlocks,\n future: [],\n }\n\n return {\n push(blocks: T[]) {\n state = historyReducer(state, { type: 'SET', payload: blocks, maxSteps })\n },\n\n undo(): T[] | null {\n if (state.past.length === 0) return null\n state = historyReducer(state, { type: 'UNDO' })\n return state.present\n },\n\n redo(): T[] | null {\n if (state.future.length === 0) return null\n state = historyReducer(state, { type: 'REDO' })\n return state.present\n },\n\n canUndo: () => state.past.length > 0,\n canRedo: () => state.future.length > 0,\n getPresent: () => state.present,\n\n clear(blocks: T[]) {\n state = { past: [], present: blocks, future: [] }\n },\n }\n}\n","import type {\n BaseBlock,\n BlockTreeInstance,\n CoreCollisionDetection,\n Rect,\n} from '@dnd-block-tree/core'\nimport {\n createBlockTree,\n createStickyCollision,\n EventEmitter,\n} from '@dnd-block-tree/core'\nimport type {\n BlockTreeControllerOptions,\n ControllerEvents,\n DragState,\n Unsubscribe,\n VanillaSensorConfig,\n} from './types'\nimport { measureDropZoneRects, detectCollision } from './collision-bridge'\nimport { DragOverlay } from './drag-overlay'\nimport { PointerSensor } from './sensors/pointer-sensor'\nimport { TouchSensor } from './sensors/touch-sensor'\nimport { KeyboardSensor } from './sensors/keyboard-sensor'\nimport type { SensorCallbacks } from './sensors/types'\nimport type { Sensor } from './sensors/types'\nimport { createBlockHistory, type BlockHistory } from './history'\n\nexport interface BlockTreeController<T extends BaseBlock = BaseBlock> {\n // Mounting\n mount(container: HTMLElement): void\n unmount(): void\n\n // Registration\n registerDraggable(id: string, element: HTMLElement): Unsubscribe\n registerDropZone(id: string, element: HTMLElement): Unsubscribe\n\n // State reads\n getDragState(): DragState\n getBlocks(): T[]\n getEffectiveBlocks(): T[]\n getExpandedMap(): Record<string, boolean>\n getBlock(id: string): T | undefined\n\n // Actions\n toggleExpand(id: string): void\n setExpandAll(expanded: boolean): void\n addBlock(type: T['type'], parentId?: string | null): T\n deleteBlock(id: string): void\n setBlocks(blocks: T[]): void\n\n // Selection\n select(id: string, mode: 'single' | 'toggle' | 'range'): void\n clearSelection(): void\n getSelectedIds(): Set<string>\n\n // History (opt-in)\n enableHistory(maxSteps?: number): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n\n // Events\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe\n\n // Overlay\n setOverlayRenderer(render: (block: T) => HTMLElement): void\n\n // Tree instance (escape hatch)\n getTree(): BlockTreeInstance<T>\n\n // Cleanup\n destroy(): void\n}\n\nexport function createBlockTreeController<T extends BaseBlock>(\n options: BlockTreeControllerOptions<T> = {}\n): BlockTreeController<T> {\n const {\n initialBlocks = [],\n containerTypes = [],\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n sensors: sensorConfig,\n onChange,\n callbacks,\n } = options\n\n // Core tree instance\n const stickyCollision = createStickyCollision(15)\n const tree = createBlockTree<T>({\n initialBlocks,\n containerTypes,\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n collisionDetection: stickyCollision,\n })\n\n // Emitter for controller-level events\n const emitter = new EventEmitter<ControllerEvents<T>>()\n\n // DOM state\n let container: HTMLElement | null = null\n const draggableElements = new Map<string, HTMLElement>()\n const dropZoneElements = new Map<string, HTMLElement>()\n let snapshotRects: Map<string, Rect> | null = null\n\n // Selection state\n const selectedIds = new Set<string>()\n let lastSelectedId: string | null = null\n\n // Sensors\n const activeSensors: Sensor[] = []\n\n // Overlay\n const overlay = new DragOverlay()\n let overlayRenderer: ((block: T) => HTMLElement) | null = null\n\n // History (opt-in)\n let history: BlockHistory<T> | null = null\n\n // Wire core tree events to callbacks and controller emitter\n tree.on('blocks:change', (blocks) => {\n onChange?.(blocks as T[])\n if (history) {\n history.push(blocks as T[])\n }\n emitter.emit('render', blocks as T[], tree.getExpandedMap())\n })\n tree.on('expand:change', () => {\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n })\n if (callbacks?.onDragStart) {\n tree.on('drag:start', (e) => callbacks.onDragStart!(e as any))\n }\n if (callbacks?.onDragEnd) {\n tree.on('drag:end', (e) => callbacks.onDragEnd!(e as any))\n }\n if (callbacks?.onBlockAdd) {\n tree.on('block:add', (e) => callbacks.onBlockAdd!(e as any))\n }\n if (callbacks?.onBlockDelete) {\n tree.on('block:delete', (e) => callbacks.onBlockDelete!(e as any))\n }\n if (callbacks?.onExpandChange) {\n tree.on('expand:change', (e) => callbacks.onExpandChange!(e as any))\n }\n if (callbacks?.onHoverChange) {\n tree.on('hover:change', (e) => callbacks.onHoverChange!(e as any))\n }\n\n // Sensor callbacks\n const sensorCallbacks: SensorCallbacks = {\n onDragStart(blockId: string, x: number, y: number) {\n const draggedIds = selectedIds.has(blockId) && selectedIds.size > 1\n ? [...selectedIds]\n : [blockId]\n\n const started = tree.startDrag(blockId, draggedIds)\n if (!started) return\n\n stickyCollision.reset()\n snapshotRects = measureDropZoneRects(dropZoneElements)\n\n // Show overlay\n const block = tree.getBlock(blockId)\n const el = draggableElements.get(blockId)\n if (block && el) {\n if (overlayRenderer) {\n overlay.show(block, el, x, y)\n } else {\n overlay.show(block, el, x, y)\n }\n }\n\n emitter.emit('drag:statechange', getDragState())\n },\n\n onDragMove(x: number, y: number) {\n if (!snapshotRects) return\n\n overlay.move(x, y)\n\n const detector = tree.getCollisionDetection()\n if (!detector) return\n\n const targetZone = detectCollision(detector, snapshotRects, x, y)\n if (targetZone) {\n tree.updateDrag(targetZone)\n }\n },\n\n onDragEnd(_x: number, _y: number) {\n const result = tree.endDrag()\n overlay.hide()\n snapshotRects = null\n\n if (result && callbacks?.onBlockMove) {\n // Fire block move callback\n callbacks.onBlockMove({\n block: tree.getBlock(tree.getBlocks()[0]?.id) as any,\n from: { parentId: null, index: 0 },\n to: { parentId: null, index: 0 },\n blocks: result.blocks as T[],\n movedIds: [],\n })\n }\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n onDragCancel() {\n tree.cancelDrag()\n overlay.hide()\n snapshotRects = null\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n }\n\n function getDragState(): DragState {\n return {\n isDragging: tree.getActiveId() !== null,\n activeId: tree.getActiveId(),\n hoverZone: tree.getHoverZone(),\n }\n }\n\n function setupSensors(): void {\n const config: VanillaSensorConfig = sensorConfig ?? {}\n if (!container) return\n\n if (config.pointer !== false) {\n const pointer = new PointerSensor(sensorCallbacks, {\n activationDistance: config.activationDistance,\n })\n pointer.attach(container)\n activeSensors.push(pointer)\n }\n\n if (config.touch !== false) {\n const touch = new TouchSensor(sensorCallbacks, {\n longPressDelay: config.longPressDelay,\n hapticFeedback: config.hapticFeedback,\n })\n touch.attach(container)\n activeSensors.push(touch)\n }\n\n if (config.keyboard) {\n const visibleBlocks = () => tree.getEffectiveBlocks()\n let focusedIndex = -1\n\n const keyboard = new KeyboardSensor({\n ...sensorCallbacks,\n onFocusPrev() {\n const blocks = visibleBlocks()\n focusedIndex = Math.max(0, focusedIndex - 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onFocusNext() {\n const blocks = visibleBlocks()\n focusedIndex = Math.min(blocks.length - 1, focusedIndex + 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && !tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onCollapse() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onFocusFirst() {\n focusedIndex = 0\n const blocks = visibleBlocks()\n if (blocks[0]) focusDraggable(blocks[0].id)\n },\n onFocusLast() {\n const blocks = visibleBlocks()\n focusedIndex = blocks.length - 1\n if (blocks[focusedIndex]) focusDraggable(blocks[focusedIndex].id)\n },\n onToggleExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type)) {\n tree.toggleExpand(block.id)\n }\n },\n onSelect() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block) {\n controller.select(block.id, 'toggle')\n }\n },\n })\n keyboard.attach(container)\n activeSensors.push(keyboard)\n }\n }\n\n function focusDraggable(id: string): void {\n const el = draggableElements.get(id)\n if (el) el.focus()\n }\n\n function teardownSensors(): void {\n for (const sensor of activeSensors) {\n sensor.detach()\n }\n activeSensors.length = 0\n }\n\n const controller: BlockTreeController<T> = {\n mount(el: HTMLElement) {\n container = el\n setupSensors()\n // Initial render\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n unmount() {\n teardownSensors()\n overlay.hide()\n container = null\n },\n\n registerDraggable(id: string, element: HTMLElement) {\n element.setAttribute('data-draggable-id', id)\n element.setAttribute('data-block-id', id)\n draggableElements.set(id, element)\n return () => {\n draggableElements.delete(id)\n }\n },\n\n registerDropZone(id: string, element: HTMLElement) {\n element.setAttribute('data-zone-id', id)\n dropZoneElements.set(id, element)\n return () => {\n dropZoneElements.delete(id)\n }\n },\n\n getDragState,\n getBlocks: () => tree.getBlocks(),\n getEffectiveBlocks: () => tree.getEffectiveBlocks(),\n getExpandedMap: () => tree.getExpandedMap(),\n getBlock: (id) => tree.getBlock(id),\n\n toggleExpand(id: string) {\n tree.toggleExpand(id)\n },\n\n setExpandAll(expanded: boolean) {\n tree.setExpandAll(expanded)\n },\n\n addBlock(type, parentId = null) {\n return tree.addBlock(type, parentId)\n },\n\n deleteBlock(id: string) {\n tree.deleteBlock(id)\n },\n\n setBlocks(blocks: T[]) {\n tree.setBlocks(blocks)\n },\n\n select(id: string, mode: 'single' | 'toggle' | 'range') {\n if (mode === 'single') {\n selectedIds.clear()\n selectedIds.add(id)\n } else if (mode === 'toggle') {\n if (selectedIds.has(id)) {\n selectedIds.delete(id)\n } else {\n selectedIds.add(id)\n }\n } else if (mode === 'range' && lastSelectedId) {\n const blocks = tree.getBlocks()\n const startIdx = blocks.findIndex(b => b.id === lastSelectedId)\n const endIdx = blocks.findIndex(b => b.id === id)\n if (startIdx !== -1 && endIdx !== -1) {\n const [from, to] = startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx]\n for (let i = from; i <= to; i++) {\n selectedIds.add(blocks[i].id)\n }\n }\n }\n lastSelectedId = id\n emitter.emit('selection:change', new Set(selectedIds))\n },\n\n clearSelection() {\n selectedIds.clear()\n lastSelectedId = null\n emitter.emit('selection:change', new Set())\n },\n\n getSelectedIds: () => new Set(selectedIds),\n\n enableHistory(maxSteps = 50) {\n history = createBlockHistory(tree.getBlocks(), { maxSteps })\n },\n\n undo() {\n if (!history) return null\n const blocks = history.undo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n redo() {\n if (!history) return null\n const blocks = history.redo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n canUndo: () => history?.canUndo() ?? false,\n canRedo: () => history?.canRedo() ?? false,\n\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe {\n return emitter.on(event, handler)\n },\n\n setOverlayRenderer(render: (block: T) => HTMLElement) {\n overlayRenderer = render\n },\n\n getTree: () => tree,\n\n destroy() {\n teardownSensors()\n overlay.hide()\n tree.destroy()\n emitter.removeAllListeners()\n draggableElements.clear()\n dropZoneElements.clear()\n selectedIds.clear()\n },\n }\n\n return controller\n}\n","import type { Rect } from '@dnd-block-tree/core'\n\nexport interface LayoutAnimationOptions {\n duration?: number\n easing?: string\n}\n\n/**\n * FLIP animation for block layout changes.\n * Records element positions before a DOM update, then animates from old to new.\n */\nexport class LayoutAnimation {\n private duration: number\n private easing: string\n private snapshots = new Map<string, DOMRect>()\n\n constructor(options: LayoutAnimationOptions = {}) {\n this.duration = options.duration ?? 200\n this.easing = options.easing ?? 'ease'\n }\n\n /** Record current positions of all block elements in a container */\n snapshot(container: HTMLElement): void {\n this.snapshots.clear()\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (id) {\n this.snapshots.set(id, el.getBoundingClientRect())\n }\n }\n }\n\n /** After DOM update, animate elements from old to new positions */\n animate(container: HTMLElement): void {\n if (this.snapshots.size === 0) return\n\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (!id) continue\n\n const oldRect = this.snapshots.get(id)\n if (!oldRect) continue\n\n const newRect = el.getBoundingClientRect()\n\n const deltaX = oldRect.left - newRect.left\n const deltaY = oldRect.top - newRect.top\n\n if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) continue\n\n el.style.transform = `translate(${deltaX}px, ${deltaY}px)`\n el.style.transition = 'none'\n\n requestAnimationFrame(() => {\n el.style.transition = `transform ${this.duration}ms ${this.easing}`\n el.style.transform = ''\n\n const onEnd = () => {\n el.style.transition = ''\n el.removeEventListener('transitionend', onEnd)\n }\n el.addEventListener('transitionend', onEnd, { once: true })\n })\n }\n\n this.snapshots.clear()\n }\n}\n","export interface VirtualScrollerOptions {\n itemHeight: number\n overscan?: number\n}\n\nexport interface VirtualRange {\n startIndex: number\n endIndex: number\n offsetY: number\n totalHeight: number\n visibleIds: Set<string>\n}\n\n/**\n * Virtual scrolling for large trees.\n * Calculates visible range based on scroll position and viewport height.\n */\nexport class VirtualScroller {\n private itemHeight: number\n private overscan: number\n\n constructor(options: VirtualScrollerOptions) {\n this.itemHeight = options.itemHeight\n this.overscan = options.overscan ?? 5\n }\n\n /** Calculate the visible range for a given scroll state */\n calculate(\n scrollTop: number,\n viewportHeight: number,\n totalItems: number,\n blockIds: string[]\n ): VirtualRange {\n const startIndex = Math.max(0, Math.floor(scrollTop / this.itemHeight) - this.overscan)\n const visibleCount = Math.ceil(viewportHeight / this.itemHeight) + 2 * this.overscan\n const endIndex = Math.min(totalItems, startIndex + visibleCount)\n\n const visibleIds = new Set<string>()\n for (let i = startIndex; i < endIndex && i < blockIds.length; i++) {\n visibleIds.add(blockIds[i])\n }\n\n return {\n startIndex,\n endIndex,\n offsetY: startIndex * this.itemHeight,\n totalHeight: totalItems * this.itemHeight,\n visibleIds,\n }\n }\n}\n","import { createElement, setDataAttributes } from '../utils/dom'\n\nexport interface DropZoneOptions {\n id: string\n height?: number\n}\n\nexport function createDropZoneElement(options: DropZoneOptions): HTMLElement {\n const { id, height = 4 } = options\n const el = createElement('div')\n setDataAttributes(el, {\n 'zone-id': id,\n })\n el.style.height = `${height}px`\n el.style.minHeight = `${height}px`\n el.style.transition = 'background-color 150ms ease'\n return el\n}\n\nexport function setDropZoneActive(el: HTMLElement, active: boolean): void {\n setDataAttributes(el, { 'zone-active': active })\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport { getBlockDepth } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { RenderBlockContext } from '../types'\nimport { createElement, setDataAttributes } from '../utils/dom'\nimport { createDropZoneElement, setDropZoneActive } from './drop-zone'\n\nexport interface TreeRendererOptions<T extends BaseBlock> {\n renderBlock: (block: T, ctx: RenderBlockContext) => HTMLElement\n containerTypes: readonly string[]\n dropZoneHeight?: number\n}\n\n/**\n * Recursive DOM tree builder. Creates the full tree DOM from blocks.\n * Keyed by data-block-id for efficient reconciliation.\n */\nexport function renderTree<T extends BaseBlock>(\n blocks: T[],\n expandedMap: Record<string, boolean>,\n controller: BlockTreeController<T>,\n options: TreeRendererOptions<T>,\n parentId: string | null = null,\n depth = 0\n): HTMLElement {\n const { renderBlock, containerTypes, dropZoneHeight } = options\n\n const container = createElement('div', {\n role: parentId === null ? 'tree' : 'group',\n })\n if (parentId === null) {\n container.setAttribute('data-dnd-tree-root', 'true')\n }\n\n const children = blocks.filter(b => b.parentId === parentId)\n const activeId = controller.getDragState().activeId\n const selectedIds = controller.getSelectedIds()\n const index = controller.getTree().getBlockIndex()\n\n // Start zone for container\n if (parentId !== null) {\n const startZone = createDropZoneElement({ id: `into-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`into-${parentId}`, startZone)\n container.appendChild(startZone)\n } else {\n const rootStart = createDropZoneElement({ id: 'root-start', height: dropZoneHeight })\n controller.registerDropZone('root-start', rootStart)\n container.appendChild(rootStart)\n }\n\n for (const block of children) {\n // Skip actively dragged block (rendered in overlay)\n if (block.id === activeId) continue\n\n // Before zone\n const beforeZone = createDropZoneElement({ id: `before-${block.id}`, height: dropZoneHeight })\n controller.registerDropZone(`before-${block.id}`, beforeZone)\n container.appendChild(beforeZone)\n\n const isContainer = containerTypes.includes(block.type)\n const isExpanded = expandedMap[block.id] !== false\n const blockDepth = getBlockDepth(index, block.id)\n\n // Build children for containers\n let childrenEl: HTMLElement | null = null\n if (isContainer && isExpanded) {\n childrenEl = renderTree(blocks, expandedMap, controller, options, block.id, depth + 1)\n }\n\n const ctx: RenderBlockContext = {\n children: childrenEl,\n depth: blockDepth,\n isExpanded,\n isDragging: block.id === activeId,\n isSelected: selectedIds.has(block.id),\n onToggleExpand: isContainer ? () => controller.toggleExpand(block.id) : null,\n }\n\n const blockEl = renderBlock(block, ctx)\n setDataAttributes(blockEl, {\n 'block-id': block.id,\n 'block-type': block.type,\n depth: String(blockDepth),\n dragging: block.id === activeId,\n selected: selectedIds.has(block.id),\n })\n\n // Register as draggable\n controller.registerDraggable(block.id, blockEl)\n\n // ARIA attributes\n blockEl.setAttribute('role', 'treeitem')\n blockEl.setAttribute('aria-level', String(blockDepth + 1))\n if (isContainer) {\n blockEl.setAttribute('aria-expanded', String(isExpanded))\n }\n blockEl.setAttribute('tabindex', '-1')\n\n container.appendChild(blockEl)\n }\n\n // End zone\n if (parentId !== null) {\n const endZone = createDropZoneElement({ id: `end-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`end-${parentId}`, endZone)\n container.appendChild(endZone)\n } else {\n const rootEnd = createDropZoneElement({ id: 'root-end', height: dropZoneHeight })\n controller.registerDropZone('root-end', rootEnd)\n container.appendChild(rootEnd)\n }\n\n return container\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { DefaultRendererOptions, Unsubscribe, RenderBlockContext } from '../types'\nimport { renderTree } from './tree-renderer'\n\nexport interface DefaultRenderer extends Unsubscribe {\n /** Force a re-render */\n refresh(): void\n}\n\n/**\n * DefaultRenderer (Layer 2): Subscribes to controller events and\n * automatically creates/updates DOM. User provides a renderBlock function.\n */\nexport function createDefaultRenderer<T extends BaseBlock>(\n controller: BlockTreeController<T>,\n options: DefaultRendererOptions<T>\n): DefaultRenderer {\n const { container, renderBlock, dropZoneHeight, animateExpand } = options\n const containerTypes = (controller.getTree() as any).containerTypes ?? []\n\n function render(blocks: T[], expandedMap: Record<string, boolean>): void {\n // Clear existing DOM\n container.innerHTML = ''\n\n // Build fresh tree DOM\n const tree = renderTree(blocks, expandedMap, controller, {\n renderBlock,\n containerTypes,\n dropZoneHeight,\n })\n\n container.appendChild(tree)\n }\n\n // Subscribe to render events\n const unsubRender = controller.on('render', render)\n\n // Initial render\n render(controller.getBlocks(), controller.getExpandedMap())\n\n const renderer: DefaultRenderer = () => {\n unsubRender()\n }\n renderer.refresh = () => {\n render(controller.getBlocks(), controller.getExpandedMap())\n }\n\n return renderer\n}\n","import { setDataAttributes } from '../utils/dom'\n\n/** Create a semi-transparent in-flow preview of a block at its target position */\nexport function createGhostPreview(sourceEl: HTMLElement): HTMLElement {\n const ghost = sourceEl.cloneNode(true) as HTMLElement\n setDataAttributes(ghost, { 'dnd-ghost': 'true' })\n ghost.style.opacity = '0.3'\n ghost.style.pointerEvents = 'none'\n ghost.removeAttribute('data-draggable-id')\n ghost.removeAttribute('data-block-id')\n return ghost\n}\n","import type { Disposable } from '../types'\n\n/** Collect multiple cleanup functions into a single disposable */\nexport function createDisposable(): Disposable & { add(fn: () => void): void } {\n const cleanups: (() => void)[] = []\n\n return {\n add(fn: () => void) {\n cleanups.push(fn)\n },\n dispose() {\n for (const fn of cleanups.reverse()) {\n fn()\n }\n cleanups.length = 0\n },\n }\n}\n"]}