dnd-block-tree 0.2.0 → 0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/types.ts","../src/core/collision.ts","../src/core/sensors.ts","../src/utils/helper.ts","../src/components/DropZone.tsx","../src/components/TreeRenderer.tsx","../src/components/DragOverlay.tsx","../src/utils/blocks.ts","../src/components/BlockTree.tsx","../src/hooks/useBlockState.tsx","../src/hooks/useTreeState.tsx"],"names":["jsx","Fragment","DndKitDragOverlay","jsxs","useCallback","activeBlock","state","useReducer","useMemo","children","createContext","useContext","useRef","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ReactNode } from 'react'\nimport type { UniqueIdentifier, CollisionDetection } from '@dnd-kit/core'\n\n/**\n * Base block interface - extend this for your custom block types\n */\nexport interface BaseBlock {\n id: string\n type: string\n parentId: string | null\n order: number\n}\n\n/**\n * Normalized index structure for efficient tree operations\n */\nexport interface BlockIndex<T extends BaseBlock = BaseBlock> {\n byId: Map<string, T>\n byParent: Map<string | null, string[]>\n}\n\n/**\n * Props passed to non-container block renderers\n */\nexport interface BlockRendererProps<T extends BaseBlock = BaseBlock> {\n block: T\n children?: ReactNode\n isDragging?: boolean\n isOver?: boolean\n depth: number\n}\n\n/**\n * Props passed to container block renderers (blocks that can have children)\n */\nexport interface ContainerRendererProps<T extends BaseBlock = BaseBlock>\n extends BlockRendererProps<T> {\n children: ReactNode\n isExpanded: boolean\n onToggleExpand: () => void\n}\n\n/**\n * Get the appropriate props type for a renderer based on whether it's a container type\n */\nexport type RendererPropsFor<\n T extends BaseBlock,\n K extends T['type'],\n C extends readonly string[]\n> = K extends C[number]\n ? ContainerRendererProps<T & { type: K }>\n : BlockRendererProps<T & { type: K }>\n\n/**\n * Map of block types to their renderers with automatic container detection\n */\nexport type BlockRenderers<\n T extends BaseBlock = BaseBlock,\n C extends readonly string[] = readonly string[]\n> = {\n [K in T['type']]: (props: RendererPropsFor<T, K, C>) => ReactNode\n}\n\n/**\n * Internal renderer type used by TreeRenderer (less strict for flexibility)\n */\nexport type InternalRenderers<T extends BaseBlock = BaseBlock> = {\n [K in T['type']]: (props: BlockRendererProps<T> | ContainerRendererProps<T>) => ReactNode\n}\n\n// ============================================================================\n// Event Types for Callbacks\n// ============================================================================\n\n/**\n * Position info for a block\n */\nexport interface BlockPosition {\n parentId: string | null\n index: number\n}\n\n/**\n * Event fired when drag starts\n */\nexport interface DragStartEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n}\n\n/**\n * Event fired during drag movement\n */\nexport interface DragMoveEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n /** Current hover zone ID, if any */\n overZone: string | null\n /** Pointer coordinates */\n coordinates: { x: number; y: number }\n}\n\n/**\n * Event fired when drag ends\n */\nexport interface DragEndEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n /** Target zone where block was dropped */\n targetZone: string | null\n /** Whether the drag was cancelled */\n cancelled: boolean\n}\n\n/**\n * Event fired when a block is moved\n */\nexport interface BlockMoveEvent<T extends BaseBlock = BaseBlock> {\n block: T\n from: BlockPosition\n to: BlockPosition\n /** All blocks after the move */\n blocks: T[]\n}\n\n/**\n * Event fired when expand state changes\n */\nexport interface ExpandChangeEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n expanded: boolean\n}\n\n/**\n * Event fired when hover zone changes\n */\nexport interface HoverChangeEvent<T extends BaseBlock = BaseBlock> {\n zoneId: string | null\n zoneType: DropZoneType | null\n /** Block being hovered over (if any) */\n targetBlock: T | null\n}\n\n// ============================================================================\n// Callback Types\n// ============================================================================\n\n/**\n * All available callback handlers for BlockTree\n */\nexport interface BlockTreeCallbacks<T extends BaseBlock = BaseBlock> {\n /** Called when drag starts. Return false to prevent drag. */\n onDragStart?: (event: DragStartEvent<T>) => boolean | void\n /** Called during drag movement (debounced) */\n onDragMove?: (event: DragMoveEvent<T>) => void\n /** Called when drag ends (success or cancel) */\n onDragEnd?: (event: DragEndEvent<T>) => void\n /** Called when drag is cancelled */\n onDragCancel?: (event: DragEndEvent<T>) => void\n /** Called after a block is moved to a new position */\n onBlockMove?: (event: BlockMoveEvent<T>) => void\n /** Called when expand/collapse state changes */\n onExpandChange?: (event: ExpandChangeEvent<T>) => void\n /** Called when hover zone changes during drag */\n onHoverChange?: (event: HoverChangeEvent<T>) => void\n}\n\n// ============================================================================\n// Customization Types\n// ============================================================================\n\n/**\n * Filter function to determine if a block can be dragged\n */\nexport type CanDragFn<T extends BaseBlock = BaseBlock> = (block: T) => boolean\n\n/**\n * Filter function to determine if a block can be dropped at a location\n */\nexport type CanDropFn<T extends BaseBlock = BaseBlock> = (\n draggedBlock: T,\n targetZone: string,\n targetBlock: T | null\n) => boolean\n\n/**\n * Custom ID generator function\n */\nexport type IdGeneratorFn = () => string\n\n/**\n * Sensor configuration\n */\nexport interface SensorConfig {\n activationDistance?: number\n activationDelay?: number\n tolerance?: number\n}\n\n/**\n * Drop zone configuration\n */\nexport interface DropZoneConfig {\n /** Height of drop zones in pixels */\n height?: number\n /** Gap between drop zones */\n gap?: number\n /** Show drop zones inside empty containers */\n showInEmptyContainers?: boolean\n}\n\n/**\n * Animation configuration\n */\nexport interface AnimationConfig {\n /** Duration for expand/collapse animations in ms */\n expandDuration?: number\n /** Duration for drag overlay animation in ms */\n dragOverlayDuration?: number\n /** Easing function (CSS timing function) */\n easing?: string\n}\n\n/**\n * Auto-expand configuration for containers during drag\n */\nexport interface AutoExpandConfig {\n /** Enable auto-expand on hover */\n enabled?: boolean\n /** Delay before expanding in ms */\n delay?: number\n /** Auto-collapse when leaving */\n collapseOnLeave?: boolean\n}\n\n/**\n * Full customization options for BlockTree\n */\nexport interface BlockTreeCustomization<T extends BaseBlock = BaseBlock> {\n /** Filter which blocks can be dragged */\n canDrag?: CanDragFn<T>\n /** Filter valid drop targets */\n canDrop?: CanDropFn<T>\n /** Custom collision detection algorithm */\n collisionDetection?: CollisionDetection\n /** Sensor configuration */\n sensors?: SensorConfig\n /** Drop zone configuration */\n dropZones?: DropZoneConfig\n /** Animation configuration */\n animation?: AnimationConfig\n /** Auto-expand containers during drag */\n autoExpand?: AutoExpandConfig\n /** Custom ID generator */\n idGenerator?: IdGeneratorFn\n /** Initially expanded block IDs */\n initialExpanded?: string[] | 'all' | 'none'\n}\n\n// ============================================================================\n// Action Types\n// ============================================================================\n\n/**\n * Block action types for the reducer\n */\nexport type BlockAction<T extends BaseBlock> =\n | { type: 'ADD_ITEM'; payload: T }\n | { type: 'DELETE_ITEM'; payload: { id: string } }\n | { type: 'SET_ALL'; payload: T[] }\n | { type: 'MOVE_ITEM'; payload: { activeId: UniqueIdentifier; targetZone: string } }\n | { type: 'INSERT_ITEM'; payload: { item: T; parentId: string | null; index: number } }\n\n// ============================================================================\n// Component Props Types\n// ============================================================================\n\n/**\n * Drag overlay renderer\n */\nexport interface DragOverlayProps<T extends BaseBlock = BaseBlock> {\n block: T\n}\n\n/**\n * BlockTree configuration options\n */\nexport interface BlockTreeConfig {\n activationDistance?: number\n previewDebounce?: number\n dropZoneHeight?: number\n}\n\n/**\n * Block state context value\n */\nexport interface BlockStateContextValue<T extends BaseBlock = BaseBlock> {\n blocks: T[]\n blockMap: Map<string, T>\n childrenMap: Map<string | null, T[]>\n indexMap: Map<string, number>\n normalizedIndex: BlockIndex<T>\n createItem: (type: T['type'], parentId?: string | null) => T\n insertItem: (type: T['type'], referenceId: string, position: 'before' | 'after') => T\n deleteItem: (id: string) => void\n moveItem: (activeId: UniqueIdentifier, targetZone: string) => void\n setAll: (blocks: T[]) => void\n}\n\n/**\n * Tree state context value (UI state)\n */\nexport interface TreeStateContextValue<T extends BaseBlock = BaseBlock> {\n activeId: string | null\n activeBlock: T | null\n hoverZone: string | null\n expandedMap: Record<string, boolean>\n effectiveBlocks: T[]\n blocksByParent: Map<string | null, T[]>\n setActiveId: (id: string | null) => void\n setHoverZone: (zone: string | null) => void\n toggleExpand: (id: string) => void\n setExpandAll: (expanded: boolean) => void\n handleHover: (zoneId: string, parentId: string | null) => void\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Drop zone types\n */\nexport type DropZoneType = 'before' | 'after' | 'into'\n\n/**\n * Extract zone type from zone ID\n */\nexport function getDropZoneType(zoneId: string): DropZoneType {\n if (zoneId.startsWith('before-')) return 'before'\n if (zoneId.startsWith('into-')) return 'into'\n return 'after'\n}\n\n/**\n * Extract block ID from zone ID\n */\nexport function extractBlockId(zoneId: string): string {\n return zoneId.replace(/^(before|after|into)-/, '')\n}\n\n/**\n * Block state provider props\n */\nexport interface BlockStateProviderProps<T extends BaseBlock = BaseBlock> {\n children: ReactNode\n initialBlocks?: T[]\n containerTypes?: readonly string[]\n onChange?: (blocks: T[]) => void\n}\n\n/**\n * Tree state provider props\n */\nexport interface TreeStateProviderProps<T extends BaseBlock = BaseBlock> {\n children: ReactNode\n blocks: T[]\n blockMap: Map<string, T>\n}\n","import type { CollisionDetection, CollisionDescriptor, UniqueIdentifier } from '@dnd-kit/core'\n\n/**\n * Compute collision scores for drop zones\n * Considers both vertical distance and horizontal containment\n */\nfunction computeCollisionScores(\n droppableContainers: Parameters<CollisionDetection>[0]['droppableContainers'],\n collisionRect: NonNullable<Parameters<CollisionDetection>[0]['collisionRect']>\n): CollisionDescriptor[] {\n const pointerX = collisionRect.left + collisionRect.width / 2\n const pointerY = collisionRect.top + collisionRect.height / 2\n\n const candidates: CollisionDescriptor[] = droppableContainers\n .map((container) => {\n const rect = container.rect.current\n if (!rect) return null\n\n const distanceToTop = Math.abs(pointerY - rect.top)\n const distanceToBottom = Math.abs(pointerY - rect.bottom)\n\n // Use nearest edge distance\n const edgeDistance = Math.min(distanceToTop, distanceToBottom)\n\n // Apply small bias to prefer bottom drop zones\n const isBelowCenter = pointerY > rect.top + rect.height / 2\n const bias = isBelowCenter ? -5 : 0\n\n // Horizontal scoring: prefer zones that match pointer's indentation level\n const isWithinX = pointerX >= rect.left && pointerX <= rect.right\n\n let horizontalScore = 0\n if (isWithinX) {\n // BONUS for zones whose left edge is further right (more indented)\n // This makes inner/nested zones win over outer zones when pointer is inside both\n horizontalScore = -rect.left * 0.1\n } else {\n // Penalty based on horizontal distance, capped at 50\n const distanceToZone = pointerX < rect.left\n ? rect.left - pointerX\n : pointerX - rect.right\n horizontalScore = Math.min(distanceToZone, 50)\n }\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value: edgeDistance + bias + horizontalScore,\n },\n } as CollisionDescriptor\n })\n .filter((c): c is CollisionDescriptor => c !== null)\n\n // Sort by score (lowest wins)\n candidates.sort((a, b) => {\n const aValue = (a.data as { value: number }).value\n const bValue = (b.data as { value: number }).value\n return aValue - bValue\n })\n\n return candidates\n}\n\n/**\n * Custom collision detection that scores drop zones by distance to nearest edge.\n * Uses edge-distance scoring with a bottom bias for more natural drag behavior.\n *\n * Key features:\n * - Scores by distance to nearest edge (top or bottom) of droppable\n * - Applies -5px bias to elements below pointer midpoint (prefers dropping below)\n * - Returns single winner (lowest score)\n */\nexport const weightedVerticalCollision: CollisionDetection = ({\n droppableContainers,\n collisionRect,\n}) => {\n if (!collisionRect) return []\n\n const candidates = computeCollisionScores(droppableContainers, collisionRect)\n return candidates.slice(0, 1)\n}\n\n/**\n * Create a collision detection with hysteresis to prevent flickering\n * between adjacent drop zones.\n *\n * @param threshold - Minimum score improvement required to switch zones (default: 15px)\n */\nexport function createStickyCollision(threshold = 15): CollisionDetection & { reset: () => void } {\n let currentZoneId: UniqueIdentifier | null = null\n\n const detector: CollisionDetection = ({\n droppableContainers,\n collisionRect,\n }) => {\n if (!collisionRect) return []\n\n const candidates = computeCollisionScores(droppableContainers, collisionRect)\n if (candidates.length === 0) return []\n\n const bestCandidate = candidates[0]\n const bestScore = (bestCandidate.data as { value: number }).value\n\n // If we have a current zone, check if it's still valid and competitive\n if (currentZoneId !== null) {\n const currentCandidate = candidates.find(c => c.id === currentZoneId)\n\n if (currentCandidate) {\n const currentScore = (currentCandidate.data as { value: number }).value\n\n // Only switch if new winner is significantly better (by threshold)\n if (currentScore - bestScore < threshold) {\n // Stick with current zone\n return [currentCandidate]\n }\n }\n }\n\n // Switch to new zone\n currentZoneId = bestCandidate.id\n return [bestCandidate]\n }\n\n // Add reset method to clear state between drags\n ;(detector as CollisionDetection & { reset: () => void }).reset = () => {\n currentZoneId = null\n }\n\n return detector as CollisionDetection & { reset: () => void }\n}\n\n/**\n * Simple closest center collision (fallback)\n */\nexport const closestCenterCollision: CollisionDetection = ({\n droppableContainers,\n collisionRect,\n}) => {\n if (!collisionRect) return []\n\n const centerY = collisionRect.top + collisionRect.height / 2\n const centerX = collisionRect.left + collisionRect.width / 2\n\n const candidates: CollisionDescriptor[] = droppableContainers\n .map((container) => {\n const rect = container.rect.current\n if (!rect) return null\n\n const containerCenterX = rect.left + rect.width / 2\n const containerCenterY = rect.top + rect.height / 2\n\n const distance = Math.sqrt(\n Math.pow(centerX - containerCenterX, 2) + Math.pow(centerY - containerCenterY, 2)\n )\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value: distance,\n },\n } as CollisionDescriptor\n })\n .filter((c): c is CollisionDescriptor => c !== null)\n\n candidates.sort((a, b) => {\n const aValue = (a.data as { value: number }).value\n const bValue = (b.data as { value: number }).value\n return aValue - bValue\n })\n\n return candidates.slice(0, 1)\n}\n","import {\n useSensor,\n useSensors,\n PointerSensor,\n TouchSensor,\n KeyboardSensor,\n type PointerActivationConstraint,\n} from '@dnd-kit/core'\nimport type { SensorConfig } from './types'\n\nconst DEFAULT_ACTIVATION_DISTANCE = 8\n\n/**\n * Return type for getSensorConfig\n */\nexport interface SensorConfigResult {\n pointer: { activationConstraint: PointerActivationConstraint }\n touch: { activationConstraint: PointerActivationConstraint }\n}\n\n/**\n * Create configured sensors with activation constraints.\n * The activation distance prevents accidental drags while still allowing clicks.\n *\n * @param config - Sensor configuration\n * @returns Configured sensors for DndContext\n */\nexport function useConfiguredSensors(config: SensorConfig = {}) {\n const {\n activationDistance = DEFAULT_ACTIVATION_DISTANCE,\n activationDelay,\n tolerance,\n } = config\n\n // Build activation constraint based on provided options\n let activationConstraint: PointerActivationConstraint\n\n if (activationDelay !== undefined) {\n activationConstraint = {\n delay: activationDelay,\n tolerance: tolerance ?? 5,\n }\n } else {\n activationConstraint = {\n distance: activationDistance,\n }\n }\n\n return useSensors(\n useSensor(PointerSensor, {\n activationConstraint,\n }),\n useSensor(TouchSensor, {\n activationConstraint,\n }),\n useSensor(KeyboardSensor)\n )\n}\n\n/**\n * Get sensor configuration for manual setup\n */\nexport function getSensorConfig(config: SensorConfig = {}): SensorConfigResult {\n const {\n activationDistance = DEFAULT_ACTIVATION_DISTANCE,\n activationDelay,\n tolerance,\n } = config\n\n let activationConstraint: PointerActivationConstraint\n\n if (activationDelay !== undefined) {\n activationConstraint = {\n delay: activationDelay,\n tolerance: tolerance ?? 5,\n }\n } else {\n activationConstraint = {\n distance: activationDistance,\n }\n }\n\n return {\n pointer: { activationConstraint },\n touch: { activationConstraint },\n }\n}\n","/**\n * Extract UUID from a zone ID by removing the prefix (before-, after-, into-, end-)\n */\nexport function extractUUID(id: string, pattern = '^(before|after|into|end)-'): string {\n const regex = new RegExp(pattern)\n return id.replace(regex, '')\n}\n\n/**\n * Create a debounced function\n */\nexport function debounce<Args extends unknown[]>(\n fn: (...args: Args) => void,\n delay: number\n): ((...args: Args) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n const debounced = ((...args: Args) => {\n if (timeoutId) clearTimeout(timeoutId)\n timeoutId = setTimeout(() => {\n fn(...args)\n timeoutId = null\n }, delay)\n }) as ((...args: Args) => void) & { cancel: () => void }\n\n debounced.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n }\n\n return debounced\n}\n\n/**\n * Generate a unique ID (simple implementation)\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n","'use client'\n\nimport { useDroppable } from '@dnd-kit/core'\nimport { memo, useCallback, useEffect } from 'react'\nimport { extractUUID } from '../utils/helper'\n\nexport interface DropZoneProps {\n id: string\n parentId: string | null\n onHover: (zoneId: string, parentId: string | null) => void\n activeId: string | null\n className?: string\n activeClassName?: string\n height?: number\n}\n\n/**\n * Drop zone indicator component\n * Shows where blocks can be dropped\n */\nfunction DropZoneComponent({\n id,\n parentId,\n onHover,\n activeId,\n className = 'h-1 rounded transition-colors',\n activeClassName = 'bg-blue-500',\n height = 4,\n}: DropZoneProps) {\n const { setNodeRef, isOver, active } = useDroppable({ id })\n\n const handleInternalHover = useCallback(() => {\n onHover(id, parentId)\n }, [onHover, id, parentId])\n\n useEffect(() => {\n if (isOver) handleInternalHover()\n }, [isOver, handleInternalHover])\n\n // Only hide \"into-\" zones for the active block (can't drop a container into itself)\n // \"after-\" zones are fine - dropping after yourself is just a no-op\n const zoneBlockId = extractUUID(id)\n const isIntoZone = id.startsWith('into-')\n if (isIntoZone && active?.id && zoneBlockId === String(active.id)) return null\n if (isIntoZone && activeId && zoneBlockId === activeId) return null\n\n return (\n <div\n ref={setNodeRef}\n data-zone-id={id}\n data-parent-id={parentId ?? ''}\n style={{ height: isOver ? height * 2 : height }}\n className={`${className} ${isOver ? activeClassName : 'bg-transparent'}`}\n />\n )\n}\n\nexport const DropZone = memo(DropZoneComponent)\n","'use client'\n\nimport { Fragment, type ReactNode } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport type { BaseBlock, InternalRenderers, ContainerRendererProps, CanDragFn } from '../core/types'\nimport { DropZone } from './DropZone'\n\nexport interface TreeRendererProps<T extends BaseBlock> {\n blocks: T[]\n blocksByParent: Map<string | null, T[]>\n parentId: string | null\n activeId: string | null\n expandedMap: Record<string, boolean>\n renderers: InternalRenderers<T>\n containerTypes: readonly string[]\n onHover: (zoneId: string, parentId: string | null) => void\n onToggleExpand: (id: string) => void\n depth?: number\n dropZoneClassName?: string\n dropZoneActiveClassName?: string\n indentClassName?: string\n rootClassName?: string\n canDrag?: CanDragFn<T>\n /** Preview position info - where to show the ghost */\n previewPosition?: { parentId: string | null; index: number } | null\n /** The dragged block for rendering preview ghost */\n draggedBlock?: T | null\n}\n\n/**\n * Draggable wrapper for individual blocks\n */\nfunction DraggableBlock<T extends BaseBlock>({\n block,\n children,\n disabled,\n}: {\n block: T\n children: (props: { isDragging: boolean }) => ReactNode\n disabled?: boolean\n}) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: block.id,\n disabled,\n })\n\n return (\n <div ref={setNodeRef} {...attributes} {...listeners}>\n {children({ isDragging })}\n </div>\n )\n}\n\n/**\n * Recursive tree renderer with smart drop zones\n */\nexport function TreeRenderer<T extends BaseBlock>({\n blocks,\n blocksByParent,\n parentId,\n activeId,\n expandedMap,\n renderers,\n containerTypes,\n onHover,\n onToggleExpand,\n depth = 0,\n dropZoneClassName,\n dropZoneActiveClassName,\n indentClassName = 'ml-6 border-l border-gray-200 pl-4',\n rootClassName = 'flex flex-col gap-1',\n canDrag,\n previewPosition,\n draggedBlock,\n}: TreeRendererProps<T>) {\n const items = blocksByParent.get(parentId) ?? []\n\n // Always filter out the dragged block - it appears in drag overlay\n // Zones stay stable because we use original order\n const filteredBlocks = items.filter(block => block.id !== activeId)\n\n // Check if preview ghost should appear in this container\n const showGhostHere = previewPosition?.parentId === parentId && draggedBlock\n\n const containerClass = depth === 0 ? rootClassName : indentClassName\n\n return (\n <div className={containerClass}>\n {/* Position-0 zone: always at the start, stable regardless of which block is dragged */}\n <DropZone\n id={parentId ? `into-${parentId}` : 'root-start'}\n parentId={parentId}\n onHover={onHover}\n activeId={activeId}\n className={dropZoneClassName}\n activeClassName={dropZoneActiveClassName}\n />\n\n {filteredBlocks.map((block, index) => {\n const isContainer = containerTypes.includes(block.type)\n const isExpanded = expandedMap[block.id] !== false // Default to expanded\n const Renderer = renderers[block.type as keyof typeof renderers]\n const isDragDisabled = canDrag ? !canDrag(block) : false\n\n // Check if ghost should appear BEFORE this block\n const ghostBeforeThis = showGhostHere && previewPosition!.index === index\n\n // Use original items to determine if this is the last block (for stable zones)\n const originalIndex = items.findIndex(b => b.id === block.id)\n const isLastInOriginal = originalIndex === items.length - 1\n\n if (!Renderer) {\n console.warn(`No renderer found for block type: ${block.type}`)\n return null\n }\n\n const GhostRenderer = draggedBlock ? renderers[draggedBlock.type as keyof typeof renderers] : null\n\n return (\n <Fragment key={block.id}>\n {/* Ghost preview before this block */}\n {ghostBeforeThis && GhostRenderer && (\n <div className=\"opacity-50 pointer-events-none\">\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </div>\n )}\n\n {/* Render the block */}\n <DraggableBlock block={block} disabled={isDragDisabled}>\n {({ isDragging }) => {\n if (isContainer) {\n const childContent = isExpanded ? (\n <>\n <TreeRenderer\n blocks={blocks}\n blocksByParent={blocksByParent}\n parentId={block.id}\n activeId={activeId}\n expandedMap={expandedMap}\n renderers={renderers}\n containerTypes={containerTypes}\n onHover={onHover}\n onToggleExpand={onToggleExpand}\n depth={depth + 1}\n dropZoneClassName={dropZoneClassName}\n dropZoneActiveClassName={dropZoneActiveClassName}\n indentClassName={indentClassName}\n rootClassName={rootClassName}\n canDrag={canDrag}\n previewPosition={previewPosition}\n draggedBlock={draggedBlock}\n />\n </>\n ) : null\n\n return Renderer({\n block: block as T & { type: typeof block.type },\n children: childContent,\n isDragging,\n depth,\n isExpanded,\n onToggleExpand: () => onToggleExpand(block.id),\n } as ContainerRendererProps<T & { type: typeof block.type }>)\n }\n\n return Renderer({\n block: block as T & { type: typeof block.type },\n isDragging,\n depth,\n })\n }}\n </DraggableBlock>\n\n {/* After-zone for non-last blocks (end-zone handles last position) */}\n {!isLastInOriginal && (\n <DropZone\n id={`after-${block.id}`}\n parentId={block.parentId}\n onHover={onHover}\n activeId={activeId}\n className={dropZoneClassName}\n activeClassName={dropZoneActiveClassName}\n />\n )}\n </Fragment>\n )\n })}\n\n {/* Ghost at end of container if index equals length */}\n {showGhostHere && previewPosition!.index >= filteredBlocks.length && draggedBlock && (() => {\n const GhostRenderer = renderers[draggedBlock.type as keyof typeof renderers]\n return GhostRenderer ? (\n <div className=\"opacity-50 pointer-events-none\">\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </div>\n ) : null\n })()}\n\n {/* End zone: for dropping at the last position in a container */}\n <DropZone\n id={parentId ? `end-${parentId}` : 'root-end'}\n parentId={parentId}\n onHover={onHover}\n activeId={activeId}\n className={dropZoneClassName}\n activeClassName={dropZoneActiveClassName}\n />\n </div>\n )\n}\n","'use client'\n\nimport { DragOverlay as DndKitDragOverlay } from '@dnd-kit/core'\nimport type { ReactNode } from 'react'\nimport type { BaseBlock } from '../core/types'\n\nexport interface DragOverlayProps<T extends BaseBlock> {\n activeBlock: T | null\n children?: (block: T) => ReactNode\n}\n\n/**\n * Default drag overlay component\n * Shows a preview of the dragged item\n */\nexport function DragOverlay<T extends BaseBlock>({\n activeBlock,\n children,\n}: DragOverlayProps<T>) {\n return (\n <DndKitDragOverlay>\n {activeBlock && (\n children ? (\n children(activeBlock)\n ) : (\n <div className=\"bg-white border border-gray-300 shadow-md rounded-md p-3 text-sm w-64 pointer-events-none\">\n <div className=\"text-gray-500 uppercase text-xs tracking-wide mb-1\">\n {activeBlock.type}\n </div>\n <div className=\"font-semibold text-gray-800\">\n Block {activeBlock.id.slice(0, 8)}\n </div>\n </div>\n )\n )}\n </DndKitDragOverlay>\n )\n}\n","import type { UniqueIdentifier } from '@dnd-kit/core'\nimport type { BaseBlock, BlockIndex } from '../core/types'\nimport { extractUUID } from './helper'\n\n/**\n * Clone a Map\n */\nexport function cloneMap<K, V>(map: Map<K, V>): Map<K, V> {\n return new Map(map)\n}\n\n/**\n * Clone a parent map with arrays\n */\nexport function cloneParentMap(map: Map<string | null, string[]>): Map<string | null, string[]> {\n const newMap = new Map<string | null, string[]>()\n for (const [k, v] of map.entries()) {\n newMap.set(k, [...v])\n }\n return newMap\n}\n\n/**\n * Compute normalized index from flat block array\n */\nexport function computeNormalizedIndex<T extends BaseBlock>(blocks: T[]): BlockIndex<T> {\n const byId = new Map<string, T>()\n const byParent = new Map<string | null, string[]>()\n\n for (const block of blocks) {\n byId.set(block.id, block)\n const key = block.parentId ?? null\n const list = byParent.get(key) ?? []\n byParent.set(key, [...list, block.id])\n }\n\n return { byId, byParent }\n}\n\n/**\n * Build ordered flat array from BlockIndex\n */\nexport function buildOrderedBlocks<T extends BaseBlock>(\n index: BlockIndex<T>,\n containerTypes: readonly string[] = []\n): T[] {\n const result: T[] = []\n\n const walk = (parentId: string | null) => {\n const children = index.byParent.get(parentId) ?? []\n for (let i = 0; i < children.length; i++) {\n const id = children[i]\n const block = index.byId.get(id)\n if (block) {\n result.push({ ...block, order: i })\n // Recursively walk children if this is a container type\n if (containerTypes.includes(block.type)) {\n walk(block.id)\n }\n }\n }\n }\n\n walk(null)\n return result\n}\n\n/**\n * Reparent a block based on drop zone ID\n *\n * @param state - Current block index\n * @param activeId - ID of the dragged block\n * @param targetZone - Drop zone ID (e.g., \"after-uuid\", \"before-uuid\", \"into-uuid\")\n * @param containerTypes - Block types that can have children\n */\nexport function reparentBlockIndex<T extends BaseBlock>(\n state: BlockIndex<T>,\n activeId: UniqueIdentifier,\n targetZone: string,\n containerTypes: readonly string[] = []\n): BlockIndex<T> {\n const byId = cloneMap(state.byId)\n const byParent = cloneParentMap(state.byParent)\n\n const dragged = byId.get(String(activeId))\n if (!dragged) return state\n\n const isRootStart = targetZone === 'root-start'\n const isRootEnd = targetZone === 'root-end'\n const isEnd = targetZone.startsWith('end-') || isRootEnd\n const zoneTargetId = extractUUID(targetZone)\n const isAfter = targetZone.startsWith('after-')\n const isInto = targetZone.startsWith('into-') || isRootStart\n const target = byId.get(zoneTargetId)\n\n const oldParentId = dragged.parentId ?? null\n const newParentId = isRootStart || isRootEnd ? null : (isInto || isEnd) ? zoneTargetId : target?.parentId ?? null\n\n // Prevent containers from being nested if they shouldn't be\n if (containerTypes.includes(dragged.type) && newParentId !== null) {\n const newParent = byId.get(newParentId)\n // Only allow nesting if the parent is also a container type\n // For now, prevent top-level containers from being nested\n if (newParent && !containerTypes.includes(newParent.type)) {\n return state\n }\n }\n\n // Cannot drop on itself\n if (dragged.id === zoneTargetId) return state\n\n // Remove dragged from old parent\n const oldList = byParent.get(oldParentId) ?? []\n const filtered = oldList.filter(id => id !== dragged.id)\n byParent.set(oldParentId, filtered)\n\n // Insert dragged into new parent\n const newList = [...(byParent.get(newParentId) ?? [])]\n let insertIndex: number\n\n if (isInto) {\n // into-{parentId} or root-start means insert at position 0\n insertIndex = 0\n } else if (isEnd) {\n // end-{parentId} or root-end means insert at the end\n insertIndex = newList.length\n } else {\n const idx = newList.indexOf(zoneTargetId)\n insertIndex = idx === -1 ? newList.length : isAfter ? idx + 1 : idx\n }\n\n // Check if already at correct position\n const currentIndex = newList.indexOf(dragged.id)\n if (dragged.parentId === newParentId && currentIndex === insertIndex) {\n return state\n }\n\n newList.splice(insertIndex, 0, dragged.id)\n byParent.set(newParentId, newList)\n\n // Update dragged block's parentId\n byId.set(dragged.id, {\n ...dragged,\n parentId: newParentId,\n })\n\n return { byId, byParent }\n}\n\n/**\n * Get all descendant IDs of a block\n */\nexport function getDescendantIds<T extends BaseBlock>(\n state: BlockIndex<T>,\n parentId: string\n): Set<string> {\n const toDelete = new Set<string>()\n const stack = [parentId]\n\n while (stack.length > 0) {\n const current = stack.pop()!\n toDelete.add(current)\n const children = state.byParent.get(current) ?? []\n stack.push(...children)\n }\n\n return toDelete\n}\n\n/**\n * Delete a block and all its descendants\n */\nexport function deleteBlockAndDescendants<T extends BaseBlock>(\n state: BlockIndex<T>,\n id: string\n): BlockIndex<T> {\n const byId = cloneMap(state.byId)\n const byParent = cloneParentMap(state.byParent)\n\n const idsToDelete = getDescendantIds(state, id)\n\n for (const deleteId of idsToDelete) {\n byId.delete(deleteId)\n byParent.delete(deleteId)\n }\n\n for (const [parent, list] of byParent.entries()) {\n byParent.set(parent, list.filter(itemId => !idsToDelete.has(itemId)))\n }\n\n return { byId, byParent }\n}\n","'use client'\n\nimport { useCallback, useRef, useReducer, useMemo, type ReactNode } from 'react'\nimport {\n DndContext,\n DragStartEvent as DndKitDragStartEvent,\n DragEndEvent as DndKitDragEndEvent,\n DragOverEvent,\n DragMoveEvent as DndKitDragMoveEvent,\n DragCancelEvent,\n} from '@dnd-kit/core'\nimport type {\n BaseBlock,\n BlockRenderers,\n BlockIndex,\n InternalRenderers,\n BlockTreeCallbacks,\n BlockTreeCustomization,\n BlockPosition,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n BlockMoveEvent,\n ExpandChangeEvent,\n HoverChangeEvent,\n DropZoneType,\n} from '../core/types'\nimport { getDropZoneType, extractBlockId } from '../core/types'\nimport { createStickyCollision } from '../core/collision'\nimport { useConfiguredSensors } from '../core/sensors'\nimport { TreeRenderer } from './TreeRenderer'\nimport { DragOverlay } from './DragOverlay'\nimport {\n computeNormalizedIndex,\n reparentBlockIndex,\n buildOrderedBlocks,\n} from '../utils/blocks'\nimport { debounce } from '../utils/helper'\n\nexport interface BlockTreeProps<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n> extends BlockTreeCallbacks<T>, BlockTreeCustomization<T> {\n /** Current blocks array */\n blocks: T[]\n /** Block renderers for each type */\n renderers: BlockRenderers<T, C>\n /** Block types that can have children */\n containerTypes?: C\n /** Called when blocks are reordered */\n onChange?: (blocks: T[]) => void\n /** Custom drag overlay renderer */\n dragOverlay?: (block: T) => ReactNode\n /** Activation distance in pixels (default: 8) */\n activationDistance?: number\n /** Preview debounce in ms (default: 150) */\n previewDebounce?: number\n /** Root container className */\n className?: string\n /** Drop zone className */\n dropZoneClassName?: string\n /** Active drop zone className */\n dropZoneActiveClassName?: string\n /** Indent className for nested items */\n indentClassName?: string\n /** Show live preview of drop position during drag (default: true) */\n showDropPreview?: boolean\n}\n\ninterface InternalState<T extends BaseBlock> {\n activeId: string | null\n hoverZone: string | null\n expandedMap: Record<string, boolean>\n virtualState: BlockIndex<T> | null\n isDragging: boolean\n}\n\n/**\n * Get block position in the tree\n */\nfunction getBlockPosition<T extends BaseBlock>(\n blocks: T[],\n blockId: string\n): BlockPosition {\n const block = blocks.find(b => b.id === blockId)\n if (!block) return { parentId: null, index: 0 }\n\n const siblings = blocks.filter(b => b.parentId === block.parentId)\n const index = siblings.findIndex(b => b.id === blockId)\n return { parentId: block.parentId, index }\n}\n\n/**\n * Compute initial expanded state\n */\nfunction computeInitialExpanded<T extends BaseBlock>(\n blocks: T[],\n containerTypes: readonly string[],\n initialExpanded: string[] | 'all' | 'none' | undefined\n): Record<string, boolean> {\n if (initialExpanded === 'none') {\n return {}\n }\n\n const expandedMap: Record<string, boolean> = {}\n const containers = blocks.filter(b => containerTypes.includes(b.type))\n\n if (initialExpanded === 'all' || initialExpanded === undefined) {\n // Default: all containers expanded\n for (const container of containers) {\n expandedMap[container.id] = true\n }\n } else if (Array.isArray(initialExpanded)) {\n for (const id of initialExpanded) {\n expandedMap[id] = true\n }\n }\n\n return expandedMap\n}\n\n/**\n * Main BlockTree component\n * Provides drag-and-drop functionality for hierarchical block structures\n */\nexport function BlockTree<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n>({\n blocks,\n renderers,\n containerTypes = [] as unknown as C,\n onChange,\n dragOverlay,\n activationDistance = 8,\n previewDebounce = 150,\n className = 'flex flex-col gap-1',\n dropZoneClassName,\n dropZoneActiveClassName,\n indentClassName,\n showDropPreview = true,\n // Callbacks\n onDragStart,\n onDragMove,\n onDragEnd,\n onDragCancel,\n onBlockMove,\n onExpandChange,\n onHoverChange,\n // Customization\n canDrag,\n canDrop,\n collisionDetection,\n sensors: sensorConfig,\n initialExpanded,\n}: BlockTreeProps<T, C>) {\n const sensors = useConfiguredSensors({\n activationDistance: sensorConfig?.activationDistance ?? activationDistance,\n activationDelay: sensorConfig?.activationDelay,\n tolerance: sensorConfig?.tolerance,\n })\n\n // Compute initial expanded state\n const initialExpandedMap = useMemo(\n () => computeInitialExpanded(blocks, containerTypes, initialExpanded),\n // Only compute on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n )\n\n // Internal state refs\n const stateRef = useRef<InternalState<T>>({\n activeId: null,\n hoverZone: null,\n expandedMap: initialExpandedMap,\n virtualState: null,\n isDragging: false,\n })\n\n // Snapshot refs for stable drag computation\n const initialBlocksRef = useRef<T[]>([])\n const cachedReorderRef = useRef<{ targetId: string; reorderedBlocks: T[] } | null>(null)\n const fromPositionRef = useRef<BlockPosition | null>(null)\n\n // Sticky collision with hysteresis to prevent flickering between adjacent zones\n const stickyCollisionRef = useRef(createStickyCollision(20))\n\n // Force re-render\n const [, forceRender] = useReducer((x: number) => x + 1, 0)\n\n // Debounced virtual state setter\n const debouncedSetVirtual = useRef(\n debounce((newBlocks: T[] | null) => {\n if (newBlocks) {\n stateRef.current.virtualState = computeNormalizedIndex(newBlocks)\n } else {\n stateRef.current.virtualState = null\n }\n forceRender()\n }, previewDebounce)\n ).current\n\n // Debounced drag move callback\n const debouncedDragMove = useRef(\n debounce((event: DragMoveEvent<T>) => {\n onDragMove?.(event)\n }, 50)\n ).current\n\n // Use original blocks for zones (stable during drag)\n const originalIndex = computeNormalizedIndex(blocks)\n\n // Blocks by parent for rendering - always use original for stable zones\n const blocksByParent = new Map<string | null, T[]>()\n for (const [parentId, ids] of originalIndex.byParent.entries()) {\n blocksByParent.set(\n parentId,\n ids.map(id => originalIndex.byId.get(id)!).filter(Boolean)\n )\n }\n\n // Compute preview position from virtualState\n const previewPosition = useMemo(() => {\n if (!showDropPreview || !stateRef.current.virtualState || !stateRef.current.activeId) {\n return null\n }\n const virtualIndex = stateRef.current.virtualState\n const activeId = stateRef.current.activeId\n const block = virtualIndex.byId.get(activeId)\n if (!block) return null\n\n const parentId = block.parentId ?? null\n const siblings = virtualIndex.byParent.get(parentId) ?? []\n const index = siblings.indexOf(activeId)\n return { parentId, index }\n }, [showDropPreview, stateRef.current.virtualState, stateRef.current.activeId])\n\n // Active block (from original, for drag overlay)\n const activeBlock = stateRef.current.activeId\n ? originalIndex.byId.get(stateRef.current.activeId) ?? null\n : null\n\n // Dragged block for preview ghost\n const draggedBlock = activeBlock\n\n // Handle drag start\n const handleDragStart = useCallback((event: DndKitDragStartEvent) => {\n const id = String(event.active.id)\n const block = blocks.find(b => b.id === id)\n\n if (!block) return\n\n // Check canDrag filter\n if (canDrag && !canDrag(block)) {\n return\n }\n\n // Create event for callback\n const dragEvent: DragStartEvent<T> = {\n block,\n blockId: id,\n }\n\n // Call user callback - can return false to prevent drag\n const result = onDragStart?.(dragEvent)\n if (result === false) {\n return\n }\n\n // Store initial position for move event\n fromPositionRef.current = getBlockPosition(blocks, id)\n\n // Reset sticky collision for fresh drag\n stickyCollisionRef.current.reset()\n\n stateRef.current.activeId = id\n stateRef.current.isDragging = true\n initialBlocksRef.current = [...blocks]\n cachedReorderRef.current = null\n forceRender()\n }, [blocks, canDrag, onDragStart])\n\n // Handle drag move\n const handleDragMove = useCallback((event: DndKitDragMoveEvent) => {\n if (!onDragMove) return\n\n const id = stateRef.current.activeId\n if (!id) return\n\n const block = blocks.find(b => b.id === id)\n if (!block) return\n\n const moveEvent: DragMoveEvent<T> = {\n block,\n blockId: id,\n overZone: stateRef.current.hoverZone,\n coordinates: {\n x: event.delta.x,\n y: event.delta.y,\n },\n }\n\n debouncedDragMove(moveEvent)\n }, [blocks, onDragMove, debouncedDragMove])\n\n // Handle drag over\n const handleDragOver = useCallback((event: DragOverEvent) => {\n if (!event.over) return\n\n const targetZone = String(event.over.id)\n const activeId = stateRef.current.activeId\n\n if (!activeId) return\n\n const activeBlock = blocks.find(b => b.id === activeId)\n const targetBlockId = extractBlockId(targetZone)\n const targetBlock = blocks.find(b => b.id === targetBlockId) ?? null\n\n // Check canDrop filter\n if (canDrop && activeBlock && !canDrop(activeBlock, targetZone, targetBlock)) {\n return\n }\n\n // Fire hover change callback if zone changed\n if (stateRef.current.hoverZone !== targetZone) {\n const zoneType: DropZoneType = getDropZoneType(targetZone)\n\n const hoverEvent: HoverChangeEvent<T> = {\n zoneId: targetZone,\n zoneType,\n targetBlock,\n }\n\n onHoverChange?.(hoverEvent)\n }\n\n stateRef.current.hoverZone = targetZone\n\n // Compute preview from snapshot\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current)\n const updatedIndex = reparentBlockIndex(baseIndex, activeId, targetZone, containerTypes)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes)\n\n // Cache for drag end\n cachedReorderRef.current = { targetId: targetZone, reorderedBlocks: orderedBlocks }\n\n // Debounced preview update (only if enabled)\n if (showDropPreview) {\n debouncedSetVirtual(orderedBlocks)\n }\n }, [blocks, containerTypes, debouncedSetVirtual, canDrop, onHoverChange, showDropPreview])\n\n // Handle drag end\n const handleDragEnd = useCallback((_event: DndKitDragEndEvent) => {\n debouncedSetVirtual.cancel()\n debouncedDragMove.cancel()\n\n const cached = cachedReorderRef.current\n const activeId = stateRef.current.activeId\n const activeBlockData = activeId ? blocks.find(b => b.id === activeId) : null\n\n // Fire drag end callback\n if (activeBlockData) {\n const endEvent: DragEndEvent<T> = {\n block: activeBlockData,\n blockId: activeId!,\n targetZone: cached?.targetId ?? null,\n cancelled: false,\n }\n onDragEnd?.(endEvent)\n }\n\n // Fire block move callback\n if (cached && activeBlockData && fromPositionRef.current) {\n const toPosition = getBlockPosition(cached.reorderedBlocks, activeBlockData.id)\n\n const moveEvent: BlockMoveEvent<T> = {\n block: activeBlockData,\n from: fromPositionRef.current,\n to: toPosition,\n blocks: cached.reorderedBlocks,\n }\n\n onBlockMove?.(moveEvent)\n }\n\n // Reset state\n stateRef.current.activeId = null\n stateRef.current.hoverZone = null\n stateRef.current.virtualState = null\n stateRef.current.isDragging = false\n cachedReorderRef.current = null\n initialBlocksRef.current = []\n fromPositionRef.current = null\n\n // Notify parent of change\n if (cached && onChange) {\n onChange(cached.reorderedBlocks)\n }\n\n forceRender()\n }, [blocks, debouncedSetVirtual, debouncedDragMove, onChange, onDragEnd, onBlockMove])\n\n // Handle drag cancel\n const handleDragCancel = useCallback((_event: DragCancelEvent) => {\n debouncedSetVirtual.cancel()\n debouncedDragMove.cancel()\n\n const activeId = stateRef.current.activeId\n const activeBlockData = activeId ? blocks.find(b => b.id === activeId) : null\n\n // Fire callbacks\n if (activeBlockData) {\n const cancelEvent: DragEndEvent<T> = {\n block: activeBlockData,\n blockId: activeId!,\n targetZone: null,\n cancelled: true,\n }\n onDragCancel?.(cancelEvent)\n onDragEnd?.(cancelEvent)\n }\n\n // Reset state\n stateRef.current.activeId = null\n stateRef.current.hoverZone = null\n stateRef.current.virtualState = null\n stateRef.current.isDragging = false\n cachedReorderRef.current = null\n initialBlocksRef.current = []\n fromPositionRef.current = null\n\n forceRender()\n }, [blocks, debouncedSetVirtual, debouncedDragMove, onDragCancel, onDragEnd])\n\n // Handle hover from drop zones\n const handleHover = useCallback((zoneId: string, _parentId: string | null) => {\n const activeId = stateRef.current.activeId\n if (!activeId) return\n\n const activeBlockData = blocks.find(b => b.id === activeId)\n const targetBlockId = extractBlockId(zoneId)\n const targetBlock = blocks.find(b => b.id === targetBlockId) ?? null\n\n // Check canDrop filter\n if (canDrop && activeBlockData && !canDrop(activeBlockData, zoneId, targetBlock)) {\n return\n }\n\n // Fire hover change callback if zone changed\n if (stateRef.current.hoverZone !== zoneId) {\n const zoneType: DropZoneType = getDropZoneType(zoneId)\n\n const hoverEvent: HoverChangeEvent<T> = {\n zoneId,\n zoneType,\n targetBlock,\n }\n\n onHoverChange?.(hoverEvent)\n }\n\n stateRef.current.hoverZone = zoneId\n\n // Compute preview from snapshot\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current)\n const updatedIndex = reparentBlockIndex(baseIndex, activeId, zoneId, containerTypes)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes)\n\n // Cache for drag end\n cachedReorderRef.current = { targetId: zoneId, reorderedBlocks: orderedBlocks }\n\n // Debounced preview update (only if enabled)\n if (showDropPreview) {\n debouncedSetVirtual(orderedBlocks)\n }\n }, [blocks, containerTypes, debouncedSetVirtual, canDrop, onHoverChange, showDropPreview])\n\n // Handle expand toggle\n const handleToggleExpand = useCallback((id: string) => {\n const newExpanded = stateRef.current.expandedMap[id] === false\n stateRef.current.expandedMap = {\n ...stateRef.current.expandedMap,\n [id]: newExpanded,\n }\n\n // Fire expand change callback\n const block = blocks.find(b => b.id === id)\n if (block && onExpandChange) {\n const expandEvent: ExpandChangeEvent<T> = {\n block,\n blockId: id,\n expanded: newExpanded,\n }\n onExpandChange(expandEvent)\n }\n\n forceRender()\n }, [blocks, onExpandChange])\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection ?? stickyCollisionRef.current}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className={className}>\n <TreeRenderer\n blocks={blocks}\n blocksByParent={blocksByParent}\n parentId={null}\n activeId={stateRef.current.activeId}\n expandedMap={stateRef.current.expandedMap}\n renderers={renderers as InternalRenderers<T>}\n containerTypes={containerTypes}\n onHover={handleHover}\n onToggleExpand={handleToggleExpand}\n dropZoneClassName={dropZoneClassName}\n dropZoneActiveClassName={dropZoneActiveClassName}\n indentClassName={indentClassName}\n rootClassName={className}\n canDrag={canDrag}\n previewPosition={previewPosition}\n draggedBlock={draggedBlock}\n />\n </div>\n <DragOverlay activeBlock={activeBlock}>\n {dragOverlay}\n </DragOverlay>\n </DndContext>\n )\n}\n","'use client'\n\nimport {\n createContext,\n useContext,\n useReducer,\n useMemo,\n useCallback,\n type ReactNode,\n} from 'react'\nimport type { UniqueIdentifier } from '@dnd-kit/core'\nimport type { BaseBlock, BlockIndex, BlockAction, BlockStateContextValue, BlockStateProviderProps } from '../core/types'\nimport {\n cloneMap,\n cloneParentMap,\n computeNormalizedIndex,\n reparentBlockIndex,\n deleteBlockAndDescendants,\n} from '../utils/blocks'\nimport { generateId } from '../utils/helper'\n\n/**\n * Block reducer for state management\n */\nfunction blockReducer<T extends BaseBlock>(\n state: BlockIndex<T>,\n action: BlockAction<T>,\n containerTypes: readonly string[] = []\n): BlockIndex<T> {\n switch (action.type) {\n case 'ADD_ITEM': {\n const byId = cloneMap(state.byId)\n const byParent = cloneParentMap(state.byParent)\n const item = action.payload\n\n byId.set(item.id, item)\n\n const parentKey = item.parentId ?? null\n const list = byParent.get(parentKey) ?? []\n\n const insertAt =\n typeof item.order === 'number' && item.order <= list.length\n ? item.order\n : list.length\n\n const newList = [...list]\n newList.splice(insertAt, 0, item.id)\n byParent.set(parentKey, newList)\n\n return { byId, byParent }\n }\n\n case 'INSERT_ITEM': {\n const { item, parentId, index } = action.payload\n const updated = new Map(state.byParent)\n const siblings = [...(updated.get(parentId) ?? [])]\n siblings.splice(index, 0, item.id)\n updated.set(parentId, siblings)\n\n return {\n byId: new Map(state.byId).set(item.id, item),\n byParent: updated,\n }\n }\n\n case 'DELETE_ITEM': {\n return deleteBlockAndDescendants(state, action.payload.id)\n }\n\n case 'SET_ALL': {\n return computeNormalizedIndex(action.payload)\n }\n\n case 'MOVE_ITEM': {\n return reparentBlockIndex(\n state,\n action.payload.activeId,\n action.payload.targetZone,\n containerTypes\n )\n }\n\n default:\n return state\n }\n}\n\n/**\n * Create block state context and hooks\n */\nexport function createBlockState<T extends BaseBlock>() {\n const BlockContext = createContext<BlockStateContextValue<T> | null>(null)\n\n function useBlockState() {\n const ctx = useContext(BlockContext)\n if (!ctx) throw new Error('useBlockState must be used inside BlockStateProvider')\n return ctx\n }\n\n function BlockStateProvider({\n children,\n initialBlocks = [],\n containerTypes = [],\n onChange,\n }: BlockStateProviderProps<T>) {\n const reducerWithContainerTypes = useCallback(\n (state: BlockIndex<T>, action: BlockAction<T>) =>\n blockReducer(state, action, containerTypes),\n [containerTypes]\n )\n\n const [state, dispatch] = useReducer(\n reducerWithContainerTypes,\n computeNormalizedIndex(initialBlocks)\n )\n\n // Compute flat blocks array\n const blocks = useMemo(() => {\n const result: T[] = []\n const walk = (parentId: string | null) => {\n const children = state.byParent.get(parentId) ?? []\n for (let i = 0; i < children.length; i++) {\n const id = children[i]\n const b = state.byId.get(id)\n if (b) {\n result.push({ ...b, order: i })\n if (containerTypes.includes(b.type)) walk(b.id)\n }\n }\n }\n walk(null)\n return result\n }, [state, containerTypes])\n\n // Notify on change\n useMemo(() => {\n onChange?.(blocks)\n }, [blocks, onChange])\n\n const blockMap = useMemo(() => state.byId, [state])\n\n const childrenMap = useMemo(() => {\n const map = new Map<string | null, T[]>()\n for (const [parentId, ids] of state.byParent.entries()) {\n map.set(\n parentId,\n ids.map(id => state.byId.get(id)!).filter(Boolean)\n )\n }\n return map\n }, [state])\n\n const indexMap = useMemo(() => {\n const map = new Map<string, number>()\n for (const ids of state.byParent.values()) {\n ids.forEach((id, index) => {\n map.set(id, index)\n })\n }\n return map\n }, [state])\n\n const createItem = useCallback(\n (type: T['type'], parentId: string | null = null): T => {\n const newItem = {\n id: generateId(),\n type,\n parentId,\n order: 0,\n } as T\n\n dispatch({ type: 'ADD_ITEM', payload: newItem })\n return newItem\n },\n []\n )\n\n const insertItem = useCallback(\n (type: T['type'], referenceId: string, position: 'before' | 'after'): T => {\n const referenceBlock = state.byId.get(referenceId)\n if (!referenceBlock) throw new Error(`Reference block ${referenceId} not found`)\n\n const parentId = referenceBlock.parentId ?? null\n const siblings = state.byParent.get(parentId) ?? []\n const index = siblings.indexOf(referenceId)\n const insertIndex = position === 'before' ? index : index + 1\n\n const newItem = {\n id: generateId(),\n type,\n parentId,\n order: insertIndex,\n } as T\n\n dispatch({\n type: 'INSERT_ITEM',\n payload: { item: newItem, parentId, index: insertIndex },\n })\n\n return newItem\n },\n [state]\n )\n\n const deleteItem = useCallback((id: string) => {\n dispatch({ type: 'DELETE_ITEM', payload: { id } })\n }, [])\n\n const moveItem = useCallback((activeId: UniqueIdentifier, targetZone: string) => {\n dispatch({ type: 'MOVE_ITEM', payload: { activeId, targetZone } })\n }, [])\n\n const setAll = useCallback((all: T[]) => {\n dispatch({ type: 'SET_ALL', payload: all })\n }, [])\n\n const value: BlockStateContextValue<T> = useMemo(\n () => ({\n blocks,\n blockMap,\n childrenMap,\n indexMap,\n normalizedIndex: state,\n createItem,\n insertItem,\n deleteItem,\n moveItem,\n setAll,\n }),\n [\n blocks,\n blockMap,\n childrenMap,\n indexMap,\n state,\n createItem,\n insertItem,\n deleteItem,\n moveItem,\n setAll,\n ]\n )\n\n return <BlockContext.Provider value={value}>{children}</BlockContext.Provider>\n }\n\n return {\n BlockStateProvider,\n useBlockState,\n }\n}\n","'use client'\n\nimport {\n createContext,\n useContext,\n useState,\n useMemo,\n useCallback,\n useReducer,\n useRef,\n useEffect,\n type ReactNode,\n} from 'react'\nimport type { BaseBlock, BlockIndex, TreeStateContextValue, TreeStateProviderProps } from '../core/types'\nimport { computeNormalizedIndex, reparentBlockIndex, buildOrderedBlocks } from '../utils/blocks'\nimport { debounce } from '../utils/helper'\n\ntype ExpandAction =\n | { type: 'TOGGLE'; id: string }\n | { type: 'SET_ALL'; expanded: boolean; ids: string[] }\n\nfunction expandReducer(\n state: Record<string, boolean>,\n action: ExpandAction\n): Record<string, boolean> {\n switch (action.type) {\n case 'TOGGLE':\n return { ...state, [action.id]: !state[action.id] }\n case 'SET_ALL': {\n const newState: Record<string, boolean> = {}\n for (const id of action.ids) {\n newState[id] = action.expanded\n }\n return newState\n }\n default:\n return state\n }\n}\n\ninterface CreateTreeStateOptions<T extends BaseBlock> {\n previewDebounce?: number\n containerTypes?: string[]\n}\n\n/**\n * Create tree state context and hooks\n * Handles UI state: active drag, hover zone, expand/collapse, virtual preview\n */\nexport function createTreeState<T extends BaseBlock>(options: CreateTreeStateOptions<T> = {}) {\n const { previewDebounce = 150, containerTypes = [] } = options\n\n const TreeContext = createContext<TreeStateContextValue<T> | null>(null)\n\n function useTreeState() {\n const ctx = useContext(TreeContext)\n if (!ctx) throw new Error('useTreeState must be used inside TreeStateProvider')\n return ctx\n }\n\n function TreeStateProvider({ children, blocks, blockMap }: TreeStateProviderProps<T>) {\n const [activeId, setActiveId] = useState<string | null>(null)\n const [hoverZone, setHoverZone] = useState<string | null>(null)\n\n // Virtual state for debounced preview\n const [virtualState, setVirtualState] = useState<BlockIndex<T> | null>(null)\n\n // Expand/collapse state\n const [expandedMap, dispatchExpand] = useReducer(expandReducer, {})\n\n // Snapshot-based computation refs\n const initialBlocksRef = useRef<T[]>([])\n const cachedReorderRef = useRef<{ targetId: string; reorderedBlocks: T[] } | null>(null)\n\n // Get active block\n const activeBlock = useMemo(() => {\n if (!activeId) return null\n return blockMap.get(activeId) ?? null\n }, [activeId, blockMap])\n\n // Debounced virtual state setter\n const debouncedSetVirtualBlocks = useMemo(\n () =>\n debounce((newBlocks: T[] | null) => {\n if (!newBlocks) {\n setVirtualState(null)\n } else {\n setVirtualState(computeNormalizedIndex(newBlocks))\n }\n }, previewDebounce),\n [previewDebounce]\n )\n\n // Compute effective state (virtual takes precedence)\n const effectiveState = useMemo(() => {\n return virtualState ?? computeNormalizedIndex(blocks)\n }, [virtualState, blocks])\n\n // Compute effective blocks array\n const effectiveBlocks = useMemo(() => {\n return buildOrderedBlocks(effectiveState, containerTypes)\n }, [effectiveState, containerTypes])\n\n // Blocks by parent for rendering\n const blocksByParent = useMemo(() => {\n const map = new Map<string | null, T[]>()\n for (const [parentId, ids] of effectiveState.byParent.entries()) {\n map.set(\n parentId,\n ids.map(id => effectiveState.byId.get(id)!).filter(Boolean)\n )\n }\n return map\n }, [effectiveState])\n\n // Handle drag start - capture snapshot\n const handleDragStart = useCallback(\n (id: string | null) => {\n setActiveId(id)\n if (id) {\n initialBlocksRef.current = [...blocks]\n cachedReorderRef.current = null\n }\n },\n [blocks]\n )\n\n // Handle drag over - compute preview\n const handleDragOver = useCallback(\n (targetZone: string) => {\n if (!activeId) return\n\n setHoverZone(targetZone)\n\n // Compute preview from snapshot\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current)\n const updatedIndex = reparentBlockIndex(baseIndex, activeId, targetZone, containerTypes)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes)\n\n // Cache for drag end\n cachedReorderRef.current = { targetId: targetZone, reorderedBlocks: orderedBlocks }\n\n // Debounced preview update\n debouncedSetVirtualBlocks(orderedBlocks)\n },\n [activeId, debouncedSetVirtualBlocks, containerTypes]\n )\n\n // Handle drag end - return cached result\n const handleDragEnd = useCallback(() => {\n debouncedSetVirtualBlocks.cancel()\n setVirtualState(null)\n setActiveId(null)\n setHoverZone(null)\n\n const result = cachedReorderRef.current\n cachedReorderRef.current = null\n initialBlocksRef.current = []\n\n return result\n }, [debouncedSetVirtualBlocks])\n\n // Hover handler for drop zones\n const handleHover = useCallback(\n (zoneId: string, _parentId: string | null) => {\n if (!activeId) return\n handleDragOver(zoneId)\n },\n [activeId, handleDragOver]\n )\n\n // Expand/collapse handlers\n const toggleExpand = useCallback((id: string) => {\n dispatchExpand({ type: 'TOGGLE', id })\n }, [])\n\n const setExpandAll = useCallback(\n (expanded: boolean) => {\n const containerIds = blocks.filter(b => containerTypes.includes(b.type)).map(b => b.id)\n dispatchExpand({ type: 'SET_ALL', expanded, ids: containerIds })\n },\n [blocks, containerTypes]\n )\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n debouncedSetVirtualBlocks.cancel()\n }\n }, [debouncedSetVirtualBlocks])\n\n const value: TreeStateContextValue<T> = useMemo(\n () => ({\n activeId,\n activeBlock,\n hoverZone,\n expandedMap,\n effectiveBlocks,\n blocksByParent,\n setActiveId: handleDragStart,\n setHoverZone,\n toggleExpand,\n setExpandAll,\n handleHover,\n }),\n [\n activeId,\n activeBlock,\n hoverZone,\n expandedMap,\n effectiveBlocks,\n blocksByParent,\n handleDragStart,\n toggleExpand,\n setExpandAll,\n handleHover,\n ]\n )\n\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>\n }\n\n return {\n TreeStateProvider,\n useTreeState,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/collision.ts","../src/core/sensors.ts","../src/utils/helper.ts","../src/components/DropZone.tsx","../src/components/TreeRenderer.tsx","../src/components/DragOverlay.tsx","../src/utils/blocks.ts","../src/components/BlockTree.tsx","../src/hooks/useBlockState.tsx","../src/hooks/useTreeState.tsx"],"names":["jsx","Fragment","DndKitDragOverlay","jsxs","useCallback","activeBlock","state","useReducer","useMemo","children","createContext","useContext","useRef","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ReactNode } from 'react'\nimport type { UniqueIdentifier, CollisionDetection } from '@dnd-kit/core'\n\n/**\n * Base block interface - extend this for your custom block types\n */\nexport interface BaseBlock {\n id: string\n type: string\n parentId: string | null\n order: number\n}\n\n/**\n * Normalized index structure for efficient tree operations\n */\nexport interface BlockIndex<T extends BaseBlock = BaseBlock> {\n byId: Map<string, T>\n byParent: Map<string | null, string[]>\n}\n\n/**\n * Props passed to non-container block renderers\n */\nexport interface BlockRendererProps<T extends BaseBlock = BaseBlock> {\n block: T\n children?: ReactNode\n isDragging?: boolean\n isOver?: boolean\n depth: number\n}\n\n/**\n * Props passed to container block renderers (blocks that can have children)\n */\nexport interface ContainerRendererProps<T extends BaseBlock = BaseBlock>\n extends BlockRendererProps<T> {\n children: ReactNode\n isExpanded: boolean\n onToggleExpand: () => void\n}\n\n/**\n * Get the appropriate props type for a renderer based on whether it's a container type\n */\nexport type RendererPropsFor<\n T extends BaseBlock,\n K extends T['type'],\n C extends readonly string[]\n> = K extends C[number]\n ? ContainerRendererProps<T & { type: K }>\n : BlockRendererProps<T & { type: K }>\n\n/**\n * Map of block types to their renderers with automatic container detection\n */\nexport type BlockRenderers<\n T extends BaseBlock = BaseBlock,\n C extends readonly string[] = readonly string[]\n> = {\n [K in T['type']]: (props: RendererPropsFor<T, K, C>) => ReactNode\n}\n\n/**\n * Internal renderer type used by TreeRenderer (less strict for flexibility)\n */\nexport type InternalRenderers<T extends BaseBlock = BaseBlock> = {\n [K in T['type']]: (props: BlockRendererProps<T> | ContainerRendererProps<T>) => ReactNode\n}\n\n// ============================================================================\n// Event Types for Callbacks\n// ============================================================================\n\n/**\n * Position info for a block\n */\nexport interface BlockPosition {\n parentId: string | null\n index: number\n}\n\n/**\n * Event fired when drag starts\n */\nexport interface DragStartEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n}\n\n/**\n * Event fired during drag movement\n */\nexport interface DragMoveEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n /** Current hover zone ID, if any */\n overZone: string | null\n /** Pointer coordinates */\n coordinates: { x: number; y: number }\n}\n\n/**\n * Event fired when drag ends\n */\nexport interface DragEndEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n /** Target zone where block was dropped */\n targetZone: string | null\n /** Whether the drag was cancelled */\n cancelled: boolean\n}\n\n/**\n * Event fired when a block is moved\n */\nexport interface BlockMoveEvent<T extends BaseBlock = BaseBlock> {\n block: T\n from: BlockPosition\n to: BlockPosition\n /** All blocks after the move */\n blocks: T[]\n}\n\n/**\n * Event fired when expand state changes\n */\nexport interface ExpandChangeEvent<T extends BaseBlock = BaseBlock> {\n block: T\n blockId: string\n expanded: boolean\n}\n\n/**\n * Event fired when hover zone changes\n */\nexport interface HoverChangeEvent<T extends BaseBlock = BaseBlock> {\n zoneId: string | null\n zoneType: DropZoneType | null\n /** Block being hovered over (if any) */\n targetBlock: T | null\n}\n\n// ============================================================================\n// Callback Types\n// ============================================================================\n\n/**\n * All available callback handlers for BlockTree\n */\nexport interface BlockTreeCallbacks<T extends BaseBlock = BaseBlock> {\n /** Called when drag starts. Return false to prevent drag. */\n onDragStart?: (event: DragStartEvent<T>) => boolean | void\n /** Called during drag movement (debounced) */\n onDragMove?: (event: DragMoveEvent<T>) => void\n /** Called when drag ends (success or cancel) */\n onDragEnd?: (event: DragEndEvent<T>) => void\n /** Called when drag is cancelled */\n onDragCancel?: (event: DragEndEvent<T>) => void\n /** Called after a block is moved to a new position */\n onBlockMove?: (event: BlockMoveEvent<T>) => void\n /** Called when expand/collapse state changes */\n onExpandChange?: (event: ExpandChangeEvent<T>) => void\n /** Called when hover zone changes during drag */\n onHoverChange?: (event: HoverChangeEvent<T>) => void\n}\n\n// ============================================================================\n// Customization Types\n// ============================================================================\n\n/**\n * Filter function to determine if a block can be dragged\n */\nexport type CanDragFn<T extends BaseBlock = BaseBlock> = (block: T) => boolean\n\n/**\n * Filter function to determine if a block can be dropped at a location\n */\nexport type CanDropFn<T extends BaseBlock = BaseBlock> = (\n draggedBlock: T,\n targetZone: string,\n targetBlock: T | null\n) => boolean\n\n/**\n * Custom ID generator function\n */\nexport type IdGeneratorFn = () => string\n\n/**\n * Sensor configuration\n */\nexport interface SensorConfig {\n activationDistance?: number\n activationDelay?: number\n tolerance?: number\n}\n\n/**\n * Drop zone configuration\n */\nexport interface DropZoneConfig {\n /** Height of drop zones in pixels */\n height?: number\n /** Gap between drop zones */\n gap?: number\n /** Show drop zones inside empty containers */\n showInEmptyContainers?: boolean\n}\n\n/**\n * Animation configuration\n */\nexport interface AnimationConfig {\n /** Duration for expand/collapse animations in ms */\n expandDuration?: number\n /** Duration for drag overlay animation in ms */\n dragOverlayDuration?: number\n /** Easing function (CSS timing function) */\n easing?: string\n}\n\n/**\n * Auto-expand configuration for containers during drag\n */\nexport interface AutoExpandConfig {\n /** Enable auto-expand on hover */\n enabled?: boolean\n /** Delay before expanding in ms */\n delay?: number\n /** Auto-collapse when leaving */\n collapseOnLeave?: boolean\n}\n\n/**\n * Full customization options for BlockTree\n */\nexport interface BlockTreeCustomization<T extends BaseBlock = BaseBlock> {\n /** Filter which blocks can be dragged */\n canDrag?: CanDragFn<T>\n /** Filter valid drop targets */\n canDrop?: CanDropFn<T>\n /** Custom collision detection algorithm */\n collisionDetection?: CollisionDetection\n /** Sensor configuration */\n sensors?: SensorConfig\n /** Drop zone configuration */\n dropZones?: DropZoneConfig\n /** Animation configuration */\n animation?: AnimationConfig\n /** Auto-expand containers during drag */\n autoExpand?: AutoExpandConfig\n /** Custom ID generator */\n idGenerator?: IdGeneratorFn\n /** Initially expanded block IDs */\n initialExpanded?: string[] | 'all' | 'none'\n}\n\n// ============================================================================\n// Action Types\n// ============================================================================\n\n/**\n * Block action types for the reducer\n */\nexport type BlockAction<T extends BaseBlock> =\n | { type: 'ADD_ITEM'; payload: T }\n | { type: 'DELETE_ITEM'; payload: { id: string } }\n | { type: 'SET_ALL'; payload: T[] }\n | { type: 'MOVE_ITEM'; payload: { activeId: UniqueIdentifier; targetZone: string } }\n | { type: 'INSERT_ITEM'; payload: { item: T; parentId: string | null; index: number } }\n\n// ============================================================================\n// Component Props Types\n// ============================================================================\n\n/**\n * Drag overlay renderer\n */\nexport interface DragOverlayProps<T extends BaseBlock = BaseBlock> {\n block: T\n}\n\n/**\n * BlockTree configuration options\n */\nexport interface BlockTreeConfig {\n activationDistance?: number\n previewDebounce?: number\n dropZoneHeight?: number\n}\n\n/**\n * Block state context value\n */\nexport interface BlockStateContextValue<T extends BaseBlock = BaseBlock> {\n blocks: T[]\n blockMap: Map<string, T>\n childrenMap: Map<string | null, T[]>\n indexMap: Map<string, number>\n normalizedIndex: BlockIndex<T>\n createItem: (type: T['type'], parentId?: string | null) => T\n insertItem: (type: T['type'], referenceId: string, position: 'before' | 'after') => T\n deleteItem: (id: string) => void\n moveItem: (activeId: UniqueIdentifier, targetZone: string) => void\n setAll: (blocks: T[]) => void\n}\n\n/**\n * Tree state context value (UI state)\n */\nexport interface TreeStateContextValue<T extends BaseBlock = BaseBlock> {\n activeId: string | null\n activeBlock: T | null\n hoverZone: string | null\n expandedMap: Record<string, boolean>\n effectiveBlocks: T[]\n blocksByParent: Map<string | null, T[]>\n setActiveId: (id: string | null) => void\n setHoverZone: (zone: string | null) => void\n toggleExpand: (id: string) => void\n setExpandAll: (expanded: boolean) => void\n handleHover: (zoneId: string, parentId: string | null) => void\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Drop zone types\n */\nexport type DropZoneType = 'before' | 'after' | 'into'\n\n/**\n * Extract zone type from zone ID\n */\nexport function getDropZoneType(zoneId: string): DropZoneType {\n if (zoneId.startsWith('before-')) return 'before'\n if (zoneId.startsWith('into-')) return 'into'\n return 'after'\n}\n\n/**\n * Extract block ID from zone ID\n */\nexport function extractBlockId(zoneId: string): string {\n return zoneId.replace(/^(before|after|into)-/, '')\n}\n\n/**\n * Block state provider props\n */\nexport interface BlockStateProviderProps<T extends BaseBlock = BaseBlock> {\n children: ReactNode\n initialBlocks?: T[]\n containerTypes?: readonly string[]\n onChange?: (blocks: T[]) => void\n}\n\n/**\n * Tree state provider props\n */\nexport interface TreeStateProviderProps<T extends BaseBlock = BaseBlock> {\n children: ReactNode\n blocks: T[]\n blockMap: Map<string, T>\n}\n","import type { CollisionDetection, CollisionDescriptor, UniqueIdentifier } from '@dnd-kit/core'\n\n/**\n * Compute collision scores for drop zones\n * Considers both vertical distance and horizontal containment\n */\nfunction computeCollisionScores(\n droppableContainers: Parameters<CollisionDetection>[0]['droppableContainers'],\n collisionRect: NonNullable<Parameters<CollisionDetection>[0]['collisionRect']>\n): CollisionDescriptor[] {\n const pointerX = collisionRect.left + collisionRect.width / 2\n const pointerY = collisionRect.top + collisionRect.height / 2\n\n const candidates: CollisionDescriptor[] = droppableContainers\n .map((container) => {\n const rect = container.rect.current\n if (!rect) return null\n\n const distanceToTop = Math.abs(pointerY - rect.top)\n const distanceToBottom = Math.abs(pointerY - rect.bottom)\n\n // Use nearest edge distance\n const edgeDistance = Math.min(distanceToTop, distanceToBottom)\n\n // Apply small bias to prefer bottom drop zones\n const isBelowCenter = pointerY > rect.top + rect.height / 2\n const bias = isBelowCenter ? -5 : 0\n\n // Horizontal scoring: prefer zones that match pointer's indentation level\n const isWithinX = pointerX >= rect.left && pointerX <= rect.right\n\n let horizontalScore = 0\n if (isWithinX) {\n // BONUS for zones whose left edge is further right (more indented)\n // This makes inner/nested zones win over outer zones when pointer is inside both\n horizontalScore = -rect.left * 0.1\n } else {\n // Penalty based on horizontal distance, capped at 50\n const distanceToZone = pointerX < rect.left\n ? rect.left - pointerX\n : pointerX - rect.right\n horizontalScore = Math.min(distanceToZone, 50)\n }\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value: edgeDistance + bias + horizontalScore,\n },\n } as CollisionDescriptor\n })\n .filter((c): c is CollisionDescriptor => c !== null)\n\n // Sort by score (lowest wins)\n candidates.sort((a, b) => {\n const aValue = (a.data as { value: number }).value\n const bValue = (b.data as { value: number }).value\n return aValue - bValue\n })\n\n return candidates\n}\n\n/**\n * Custom collision detection that scores drop zones by distance to nearest edge.\n * Uses edge-distance scoring with a bottom bias for more natural drag behavior.\n *\n * Key features:\n * - Scores by distance to nearest edge (top or bottom) of droppable\n * - Applies -5px bias to elements below pointer midpoint (prefers dropping below)\n * - Returns single winner (lowest score)\n */\nexport const weightedVerticalCollision: CollisionDetection = ({\n droppableContainers,\n collisionRect,\n}) => {\n if (!collisionRect) return []\n\n const candidates = computeCollisionScores(droppableContainers, collisionRect)\n return candidates.slice(0, 1)\n}\n\n/**\n * Create a collision detection with hysteresis to prevent flickering\n * between adjacent drop zones.\n *\n * @param threshold - Minimum score improvement required to switch zones (default: 15px)\n */\nexport function createStickyCollision(threshold = 15): CollisionDetection & { reset: () => void } {\n let currentZoneId: UniqueIdentifier | null = null\n\n const detector: CollisionDetection = ({\n droppableContainers,\n collisionRect,\n }) => {\n if (!collisionRect) return []\n\n const candidates = computeCollisionScores(droppableContainers, collisionRect)\n if (candidates.length === 0) return []\n\n const bestCandidate = candidates[0]\n const bestScore = (bestCandidate.data as { value: number }).value\n\n // If we have a current zone, check if it's still valid and competitive\n if (currentZoneId !== null) {\n const currentCandidate = candidates.find(c => c.id === currentZoneId)\n\n if (currentCandidate) {\n const currentScore = (currentCandidate.data as { value: number }).value\n\n // Only switch if new winner is significantly better (by threshold)\n if (currentScore - bestScore < threshold) {\n // Stick with current zone\n return [currentCandidate]\n }\n }\n }\n\n // Switch to new zone\n currentZoneId = bestCandidate.id\n return [bestCandidate]\n }\n\n // Add reset method to clear state between drags\n ;(detector as CollisionDetection & { reset: () => void }).reset = () => {\n currentZoneId = null\n }\n\n return detector as CollisionDetection & { reset: () => void }\n}\n\n/**\n * Simple closest center collision (fallback)\n */\nexport const closestCenterCollision: CollisionDetection = ({\n droppableContainers,\n collisionRect,\n}) => {\n if (!collisionRect) return []\n\n const centerY = collisionRect.top + collisionRect.height / 2\n const centerX = collisionRect.left + collisionRect.width / 2\n\n const candidates: CollisionDescriptor[] = droppableContainers\n .map((container) => {\n const rect = container.rect.current\n if (!rect) return null\n\n const containerCenterX = rect.left + rect.width / 2\n const containerCenterY = rect.top + rect.height / 2\n\n const distance = Math.sqrt(\n Math.pow(centerX - containerCenterX, 2) + Math.pow(centerY - containerCenterY, 2)\n )\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value: distance,\n },\n } as CollisionDescriptor\n })\n .filter((c): c is CollisionDescriptor => c !== null)\n\n candidates.sort((a, b) => {\n const aValue = (a.data as { value: number }).value\n const bValue = (b.data as { value: number }).value\n return aValue - bValue\n })\n\n return candidates.slice(0, 1)\n}\n","import {\n useSensor,\n useSensors,\n PointerSensor,\n TouchSensor,\n KeyboardSensor,\n type PointerActivationConstraint,\n} from '@dnd-kit/core'\nimport type { SensorConfig } from './types'\n\nconst DEFAULT_ACTIVATION_DISTANCE = 8\n\n/**\n * Return type for getSensorConfig\n */\nexport interface SensorConfigResult {\n pointer: { activationConstraint: PointerActivationConstraint }\n touch: { activationConstraint: PointerActivationConstraint }\n}\n\n/**\n * Create configured sensors with activation constraints.\n * The activation distance prevents accidental drags while still allowing clicks.\n *\n * @param config - Sensor configuration\n * @returns Configured sensors for DndContext\n */\nexport function useConfiguredSensors(config: SensorConfig = {}) {\n const {\n activationDistance = DEFAULT_ACTIVATION_DISTANCE,\n activationDelay,\n tolerance,\n } = config\n\n // Build activation constraint based on provided options\n let pointerConstraint: PointerActivationConstraint\n let touchConstraint: PointerActivationConstraint\n\n if (activationDelay !== undefined) {\n pointerConstraint = {\n delay: activationDelay,\n tolerance: tolerance ?? 5,\n }\n touchConstraint = pointerConstraint\n } else {\n // For pointer (mouse), use distance-based activation\n pointerConstraint = {\n distance: activationDistance,\n }\n // For touch, use delay-based activation to not interfere with scrolling\n touchConstraint = {\n delay: 200,\n tolerance: 5,\n }\n }\n\n return useSensors(\n useSensor(PointerSensor, {\n activationConstraint: pointerConstraint,\n }),\n useSensor(TouchSensor, {\n activationConstraint: touchConstraint,\n }),\n useSensor(KeyboardSensor)\n )\n}\n\n/**\n * Get sensor configuration for manual setup\n */\nexport function getSensorConfig(config: SensorConfig = {}): SensorConfigResult {\n const {\n activationDistance = DEFAULT_ACTIVATION_DISTANCE,\n activationDelay,\n tolerance,\n } = config\n\n let activationConstraint: PointerActivationConstraint\n\n if (activationDelay !== undefined) {\n activationConstraint = {\n delay: activationDelay,\n tolerance: tolerance ?? 5,\n }\n } else {\n activationConstraint = {\n distance: activationDistance,\n }\n }\n\n return {\n pointer: { activationConstraint },\n touch: { activationConstraint },\n }\n}\n","/**\n * Extract UUID from a zone ID by removing the prefix (before-, after-, into-, end-)\n */\nexport function extractUUID(id: string, pattern = '^(before|after|into|end)-'): string {\n const regex = new RegExp(pattern)\n return id.replace(regex, '')\n}\n\n/**\n * Create a debounced function\n */\nexport function debounce<Args extends unknown[]>(\n fn: (...args: Args) => void,\n delay: number\n): ((...args: Args) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n const debounced = ((...args: Args) => {\n if (timeoutId) clearTimeout(timeoutId)\n timeoutId = setTimeout(() => {\n fn(...args)\n timeoutId = null\n }, delay)\n }) as ((...args: Args) => void) & { cancel: () => void }\n\n debounced.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n }\n\n return debounced\n}\n\n/**\n * Generate a unique ID (simple implementation)\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n","'use client'\n\nimport { useDroppable } from '@dnd-kit/core'\nimport { memo, useCallback, useEffect } from 'react'\nimport { extractUUID } from '../utils/helper'\n\nexport interface DropZoneProps {\n id: string\n parentId: string | null\n onHover: (zoneId: string, parentId: string | null) => void\n activeId: string | null\n className?: string\n activeClassName?: string\n height?: number\n}\n\n/**\n * Drop zone indicator component\n * Shows where blocks can be dropped\n */\nfunction DropZoneComponent({\n id,\n parentId,\n onHover,\n activeId,\n className = 'h-1 rounded transition-colors',\n activeClassName = 'bg-blue-500',\n height = 4,\n}: DropZoneProps) {\n const { setNodeRef, isOver, active } = useDroppable({ id })\n\n const handleInternalHover = useCallback(() => {\n onHover(id, parentId)\n }, [onHover, id, parentId])\n\n useEffect(() => {\n if (isOver) handleInternalHover()\n }, [isOver, handleInternalHover])\n\n // Only hide \"into-\" zones for the active block (can't drop a container into itself)\n // \"after-\" zones are fine - dropping after yourself is just a no-op\n const zoneBlockId = extractUUID(id)\n const isIntoZone = id.startsWith('into-')\n if (isIntoZone && active?.id && zoneBlockId === String(active.id)) return null\n if (isIntoZone && activeId && zoneBlockId === activeId) return null\n\n return (\n <div\n ref={setNodeRef}\n data-zone-id={id}\n data-parent-id={parentId ?? ''}\n style={{ height: isOver ? height * 2 : height }}\n className={`${className} ${isOver ? activeClassName : 'bg-transparent'}`}\n />\n )\n}\n\nexport const DropZone = memo(DropZoneComponent)\n","'use client'\n\nimport { Fragment, type ReactNode } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport type { BaseBlock, InternalRenderers, ContainerRendererProps, CanDragFn } from '../core/types'\nimport { DropZone } from './DropZone'\n\nexport interface TreeRendererProps<T extends BaseBlock> {\n blocks: T[]\n blocksByParent: Map<string | null, T[]>\n parentId: string | null\n activeId: string | null\n expandedMap: Record<string, boolean>\n renderers: InternalRenderers<T>\n containerTypes: readonly string[]\n onHover: (zoneId: string, parentId: string | null) => void\n onToggleExpand: (id: string) => void\n depth?: number\n dropZoneClassName?: string\n dropZoneActiveClassName?: string\n indentClassName?: string\n rootClassName?: string\n canDrag?: CanDragFn<T>\n /** Preview position info - where to show the ghost */\n previewPosition?: { parentId: string | null; index: number } | null\n /** The dragged block for rendering preview ghost */\n draggedBlock?: T | null\n}\n\n/**\n * Draggable wrapper for individual blocks\n */\nfunction DraggableBlock<T extends BaseBlock>({\n block,\n children,\n disabled,\n}: {\n block: T\n children: (props: { isDragging: boolean }) => ReactNode\n disabled?: boolean\n}) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: block.id,\n disabled,\n })\n\n return (\n <div\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n style={{ touchAction: 'none', minWidth: 0 }}\n >\n {children({ isDragging })}\n </div>\n )\n}\n\n/**\n * Recursive tree renderer with smart drop zones\n */\nexport function TreeRenderer<T extends BaseBlock>({\n blocks,\n blocksByParent,\n parentId,\n activeId,\n expandedMap,\n renderers,\n containerTypes,\n onHover,\n onToggleExpand,\n depth = 0,\n dropZoneClassName,\n dropZoneActiveClassName,\n indentClassName = 'ml-6 border-l border-gray-200 pl-4',\n rootClassName = 'flex flex-col gap-1',\n canDrag,\n previewPosition,\n draggedBlock,\n}: TreeRendererProps<T>) {\n const items = blocksByParent.get(parentId) ?? []\n\n // Always filter out the dragged block - it appears in drag overlay\n // Zones stay stable because we use original order\n const filteredBlocks = items.filter(block => block.id !== activeId)\n\n // Check if preview ghost should appear in this container\n const showGhostHere = previewPosition?.parentId === parentId && draggedBlock\n\n const containerClass = depth === 0 ? rootClassName : indentClassName\n\n return (\n <div className={containerClass} style={{ minWidth: 0 }}>\n {/* Position-0 zone: always at the start, stable regardless of which block is dragged */}\n <DropZone\n id={parentId ? `into-${parentId}` : 'root-start'}\n parentId={parentId}\n onHover={onHover}\n activeId={activeId}\n className={dropZoneClassName}\n activeClassName={dropZoneActiveClassName}\n />\n\n {filteredBlocks.map((block, index) => {\n const isContainer = containerTypes.includes(block.type)\n const isExpanded = expandedMap[block.id] !== false // Default to expanded\n const Renderer = renderers[block.type as keyof typeof renderers]\n const isDragDisabled = canDrag ? !canDrag(block) : false\n\n // Check if ghost should appear BEFORE this block\n const ghostBeforeThis = showGhostHere && previewPosition!.index === index\n\n // Use original items to determine if this is the last block (for stable zones)\n const originalIndex = items.findIndex(b => b.id === block.id)\n const isLastInOriginal = originalIndex === items.length - 1\n\n if (!Renderer) {\n console.warn(`No renderer found for block type: ${block.type}`)\n return null\n }\n\n const GhostRenderer = draggedBlock ? renderers[draggedBlock.type as keyof typeof renderers] : null\n\n return (\n <Fragment key={block.id}>\n {/* Ghost preview before this block */}\n {ghostBeforeThis && GhostRenderer && (\n <div className=\"opacity-50 pointer-events-none\" style={{ minWidth: 0 }}>\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </div>\n )}\n\n {/* Render the block */}\n <DraggableBlock block={block} disabled={isDragDisabled}>\n {({ isDragging }) => {\n if (isContainer) {\n const childContent = isExpanded ? (\n <>\n <TreeRenderer\n blocks={blocks}\n blocksByParent={blocksByParent}\n parentId={block.id}\n activeId={activeId}\n expandedMap={expandedMap}\n renderers={renderers}\n containerTypes={containerTypes}\n onHover={onHover}\n onToggleExpand={onToggleExpand}\n depth={depth + 1}\n dropZoneClassName={dropZoneClassName}\n dropZoneActiveClassName={dropZoneActiveClassName}\n indentClassName={indentClassName}\n rootClassName={rootClassName}\n canDrag={canDrag}\n previewPosition={previewPosition}\n draggedBlock={draggedBlock}\n />\n </>\n ) : null\n\n return Renderer({\n block: block as T & { type: typeof block.type },\n children: childContent,\n isDragging,\n depth,\n isExpanded,\n onToggleExpand: () => onToggleExpand(block.id),\n } as ContainerRendererProps<T & { type: typeof block.type }>)\n }\n\n return Renderer({\n block: block as T & { type: typeof block.type },\n isDragging,\n depth,\n })\n }}\n </DraggableBlock>\n\n {/* After-zone for non-last blocks (end-zone handles last position) */}\n {!isLastInOriginal && (\n <DropZone\n id={`after-${block.id}`}\n parentId={block.parentId}\n onHover={onHover}\n activeId={activeId}\n className={dropZoneClassName}\n activeClassName={dropZoneActiveClassName}\n />\n )}\n </Fragment>\n )\n })}\n\n {/* Ghost at end of container if index equals length */}\n {showGhostHere && previewPosition!.index >= filteredBlocks.length && draggedBlock && (() => {\n const GhostRenderer = renderers[draggedBlock.type as keyof typeof renderers]\n return GhostRenderer ? (\n <div className=\"opacity-50 pointer-events-none\" style={{ minWidth: 0 }}>\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </div>\n ) : null\n })()}\n\n {/* End zone: for dropping at the last position in a container */}\n <DropZone\n id={parentId ? `end-${parentId}` : 'root-end'}\n parentId={parentId}\n onHover={onHover}\n activeId={activeId}\n className={dropZoneClassName}\n activeClassName={dropZoneActiveClassName}\n />\n </div>\n )\n}\n","'use client'\n\nimport { DragOverlay as DndKitDragOverlay } from '@dnd-kit/core'\nimport type { ReactNode } from 'react'\nimport type { BaseBlock } from '../core/types'\n\nexport interface DragOverlayProps<T extends BaseBlock> {\n activeBlock: T | null\n children?: (block: T) => ReactNode\n}\n\n/**\n * Default drag overlay component\n * Shows a preview of the dragged item\n */\nexport function DragOverlay<T extends BaseBlock>({\n activeBlock,\n children,\n}: DragOverlayProps<T>) {\n return (\n <DndKitDragOverlay>\n {activeBlock && (\n children ? (\n children(activeBlock)\n ) : (\n <div className=\"bg-white border border-gray-300 shadow-md rounded-md p-3 text-sm w-64 pointer-events-none\">\n <div className=\"text-gray-500 uppercase text-xs tracking-wide mb-1\">\n {activeBlock.type}\n </div>\n <div className=\"font-semibold text-gray-800\">\n Block {activeBlock.id.slice(0, 8)}\n </div>\n </div>\n )\n )}\n </DndKitDragOverlay>\n )\n}\n","import type { UniqueIdentifier } from '@dnd-kit/core'\nimport type { BaseBlock, BlockIndex } from '../core/types'\nimport { extractUUID } from './helper'\n\n/**\n * Clone a Map\n */\nexport function cloneMap<K, V>(map: Map<K, V>): Map<K, V> {\n return new Map(map)\n}\n\n/**\n * Clone a parent map with arrays\n */\nexport function cloneParentMap(map: Map<string | null, string[]>): Map<string | null, string[]> {\n const newMap = new Map<string | null, string[]>()\n for (const [k, v] of map.entries()) {\n newMap.set(k, [...v])\n }\n return newMap\n}\n\n/**\n * Compute normalized index from flat block array\n */\nexport function computeNormalizedIndex<T extends BaseBlock>(blocks: T[]): BlockIndex<T> {\n const byId = new Map<string, T>()\n const byParent = new Map<string | null, string[]>()\n\n for (const block of blocks) {\n byId.set(block.id, block)\n const key = block.parentId ?? null\n const list = byParent.get(key) ?? []\n byParent.set(key, [...list, block.id])\n }\n\n return { byId, byParent }\n}\n\n/**\n * Build ordered flat array from BlockIndex\n */\nexport function buildOrderedBlocks<T extends BaseBlock>(\n index: BlockIndex<T>,\n containerTypes: readonly string[] = []\n): T[] {\n const result: T[] = []\n\n const walk = (parentId: string | null) => {\n const children = index.byParent.get(parentId) ?? []\n for (let i = 0; i < children.length; i++) {\n const id = children[i]\n const block = index.byId.get(id)\n if (block) {\n result.push({ ...block, order: i })\n // Recursively walk children if this is a container type\n if (containerTypes.includes(block.type)) {\n walk(block.id)\n }\n }\n }\n }\n\n walk(null)\n return result\n}\n\n/**\n * Reparent a block based on drop zone ID\n *\n * @param state - Current block index\n * @param activeId - ID of the dragged block\n * @param targetZone - Drop zone ID (e.g., \"after-uuid\", \"before-uuid\", \"into-uuid\")\n * @param containerTypes - Block types that can have children\n */\nexport function reparentBlockIndex<T extends BaseBlock>(\n state: BlockIndex<T>,\n activeId: UniqueIdentifier,\n targetZone: string,\n containerTypes: readonly string[] = []\n): BlockIndex<T> {\n const byId = cloneMap(state.byId)\n const byParent = cloneParentMap(state.byParent)\n\n const dragged = byId.get(String(activeId))\n if (!dragged) return state\n\n const isRootStart = targetZone === 'root-start'\n const isRootEnd = targetZone === 'root-end'\n const isEnd = targetZone.startsWith('end-') || isRootEnd\n const zoneTargetId = extractUUID(targetZone)\n const isAfter = targetZone.startsWith('after-')\n const isInto = targetZone.startsWith('into-') || isRootStart\n const target = byId.get(zoneTargetId)\n\n const oldParentId = dragged.parentId ?? null\n const newParentId = isRootStart || isRootEnd ? null : (isInto || isEnd) ? zoneTargetId : target?.parentId ?? null\n\n // Prevent containers from being nested if they shouldn't be\n if (containerTypes.includes(dragged.type) && newParentId !== null) {\n const newParent = byId.get(newParentId)\n // Only allow nesting if the parent is also a container type\n // For now, prevent top-level containers from being nested\n if (newParent && !containerTypes.includes(newParent.type)) {\n return state\n }\n }\n\n // Cannot drop on itself\n if (dragged.id === zoneTargetId) return state\n\n // Remove dragged from old parent\n const oldList = byParent.get(oldParentId) ?? []\n const filtered = oldList.filter(id => id !== dragged.id)\n byParent.set(oldParentId, filtered)\n\n // Insert dragged into new parent\n const newList = [...(byParent.get(newParentId) ?? [])]\n let insertIndex: number\n\n if (isInto) {\n // into-{parentId} or root-start means insert at position 0\n insertIndex = 0\n } else if (isEnd) {\n // end-{parentId} or root-end means insert at the end\n insertIndex = newList.length\n } else {\n const idx = newList.indexOf(zoneTargetId)\n insertIndex = idx === -1 ? newList.length : isAfter ? idx + 1 : idx\n }\n\n // Check if already at correct position\n const currentIndex = newList.indexOf(dragged.id)\n if (dragged.parentId === newParentId && currentIndex === insertIndex) {\n return state\n }\n\n newList.splice(insertIndex, 0, dragged.id)\n byParent.set(newParentId, newList)\n\n // Update dragged block's parentId\n byId.set(dragged.id, {\n ...dragged,\n parentId: newParentId,\n })\n\n return { byId, byParent }\n}\n\n/**\n * Get all descendant IDs of a block\n */\nexport function getDescendantIds<T extends BaseBlock>(\n state: BlockIndex<T>,\n parentId: string\n): Set<string> {\n const toDelete = new Set<string>()\n const stack = [parentId]\n\n while (stack.length > 0) {\n const current = stack.pop()!\n toDelete.add(current)\n const children = state.byParent.get(current) ?? []\n stack.push(...children)\n }\n\n return toDelete\n}\n\n/**\n * Delete a block and all its descendants\n */\nexport function deleteBlockAndDescendants<T extends BaseBlock>(\n state: BlockIndex<T>,\n id: string\n): BlockIndex<T> {\n const byId = cloneMap(state.byId)\n const byParent = cloneParentMap(state.byParent)\n\n const idsToDelete = getDescendantIds(state, id)\n\n for (const deleteId of idsToDelete) {\n byId.delete(deleteId)\n byParent.delete(deleteId)\n }\n\n for (const [parent, list] of byParent.entries()) {\n byParent.set(parent, list.filter(itemId => !idsToDelete.has(itemId)))\n }\n\n return { byId, byParent }\n}\n","'use client'\n\nimport { useCallback, useRef, useReducer, useMemo, type ReactNode } from 'react'\nimport {\n DndContext,\n DragStartEvent as DndKitDragStartEvent,\n DragEndEvent as DndKitDragEndEvent,\n DragOverEvent,\n DragMoveEvent as DndKitDragMoveEvent,\n DragCancelEvent,\n} from '@dnd-kit/core'\nimport type {\n BaseBlock,\n BlockRenderers,\n BlockIndex,\n InternalRenderers,\n BlockTreeCallbacks,\n BlockTreeCustomization,\n BlockPosition,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n BlockMoveEvent,\n ExpandChangeEvent,\n HoverChangeEvent,\n DropZoneType,\n} from '../core/types'\nimport { getDropZoneType, extractBlockId } from '../core/types'\nimport { createStickyCollision } from '../core/collision'\nimport { useConfiguredSensors } from '../core/sensors'\nimport { TreeRenderer } from './TreeRenderer'\nimport { DragOverlay } from './DragOverlay'\nimport {\n computeNormalizedIndex,\n reparentBlockIndex,\n buildOrderedBlocks,\n} from '../utils/blocks'\nimport { debounce } from '../utils/helper'\n\nexport interface BlockTreeProps<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n> extends BlockTreeCallbacks<T>, BlockTreeCustomization<T> {\n /** Current blocks array */\n blocks: T[]\n /** Block renderers for each type */\n renderers: BlockRenderers<T, C>\n /** Block types that can have children */\n containerTypes?: C\n /** Called when blocks are reordered */\n onChange?: (blocks: T[]) => void\n /** Custom drag overlay renderer */\n dragOverlay?: (block: T) => ReactNode\n /** Activation distance in pixels (default: 8) */\n activationDistance?: number\n /** Preview debounce in ms (default: 150) */\n previewDebounce?: number\n /** Root container className */\n className?: string\n /** Drop zone className */\n dropZoneClassName?: string\n /** Active drop zone className */\n dropZoneActiveClassName?: string\n /** Indent className for nested items */\n indentClassName?: string\n /** Show live preview of drop position during drag (default: true) */\n showDropPreview?: boolean\n}\n\ninterface InternalState<T extends BaseBlock> {\n activeId: string | null\n hoverZone: string | null\n expandedMap: Record<string, boolean>\n virtualState: BlockIndex<T> | null\n isDragging: boolean\n}\n\n/**\n * Get block position in the tree\n */\nfunction getBlockPosition<T extends BaseBlock>(\n blocks: T[],\n blockId: string\n): BlockPosition {\n const block = blocks.find(b => b.id === blockId)\n if (!block) return { parentId: null, index: 0 }\n\n const siblings = blocks.filter(b => b.parentId === block.parentId)\n const index = siblings.findIndex(b => b.id === blockId)\n return { parentId: block.parentId, index }\n}\n\n/**\n * Compute initial expanded state\n */\nfunction computeInitialExpanded<T extends BaseBlock>(\n blocks: T[],\n containerTypes: readonly string[],\n initialExpanded: string[] | 'all' | 'none' | undefined\n): Record<string, boolean> {\n if (initialExpanded === 'none') {\n return {}\n }\n\n const expandedMap: Record<string, boolean> = {}\n const containers = blocks.filter(b => containerTypes.includes(b.type))\n\n if (initialExpanded === 'all' || initialExpanded === undefined) {\n // Default: all containers expanded\n for (const container of containers) {\n expandedMap[container.id] = true\n }\n } else if (Array.isArray(initialExpanded)) {\n for (const id of initialExpanded) {\n expandedMap[id] = true\n }\n }\n\n return expandedMap\n}\n\n/**\n * Main BlockTree component\n * Provides drag-and-drop functionality for hierarchical block structures\n */\nexport function BlockTree<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n>({\n blocks,\n renderers,\n containerTypes = [] as unknown as C,\n onChange,\n dragOverlay,\n activationDistance = 8,\n previewDebounce = 150,\n className = 'flex flex-col gap-1',\n dropZoneClassName,\n dropZoneActiveClassName,\n indentClassName,\n showDropPreview = true,\n // Callbacks\n onDragStart,\n onDragMove,\n onDragEnd,\n onDragCancel,\n onBlockMove,\n onExpandChange,\n onHoverChange,\n // Customization\n canDrag,\n canDrop,\n collisionDetection,\n sensors: sensorConfig,\n initialExpanded,\n}: BlockTreeProps<T, C>) {\n const sensors = useConfiguredSensors({\n activationDistance: sensorConfig?.activationDistance ?? activationDistance,\n activationDelay: sensorConfig?.activationDelay,\n tolerance: sensorConfig?.tolerance,\n })\n\n // Compute initial expanded state\n const initialExpandedMap = useMemo(\n () => computeInitialExpanded(blocks, containerTypes, initialExpanded),\n // Only compute on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n )\n\n // Internal state refs\n const stateRef = useRef<InternalState<T>>({\n activeId: null,\n hoverZone: null,\n expandedMap: initialExpandedMap,\n virtualState: null,\n isDragging: false,\n })\n\n // Snapshot refs for stable drag computation\n const initialBlocksRef = useRef<T[]>([])\n const cachedReorderRef = useRef<{ targetId: string; reorderedBlocks: T[] } | null>(null)\n const fromPositionRef = useRef<BlockPosition | null>(null)\n\n // Sticky collision with hysteresis to prevent flickering between adjacent zones\n const stickyCollisionRef = useRef(createStickyCollision(20))\n\n // Force re-render\n const [, forceRender] = useReducer((x: number) => x + 1, 0)\n\n // Debounced virtual state setter\n const debouncedSetVirtual = useRef(\n debounce((newBlocks: T[] | null) => {\n if (newBlocks) {\n stateRef.current.virtualState = computeNormalizedIndex(newBlocks)\n } else {\n stateRef.current.virtualState = null\n }\n forceRender()\n }, previewDebounce)\n ).current\n\n // Debounced drag move callback\n const debouncedDragMove = useRef(\n debounce((event: DragMoveEvent<T>) => {\n onDragMove?.(event)\n }, 50)\n ).current\n\n // Use original blocks for zones (stable during drag)\n const originalIndex = computeNormalizedIndex(blocks)\n\n // Blocks by parent for rendering - always use original for stable zones\n const blocksByParent = new Map<string | null, T[]>()\n for (const [parentId, ids] of originalIndex.byParent.entries()) {\n blocksByParent.set(\n parentId,\n ids.map(id => originalIndex.byId.get(id)!).filter(Boolean)\n )\n }\n\n // Compute preview position from virtualState\n const previewPosition = useMemo(() => {\n if (!showDropPreview || !stateRef.current.virtualState || !stateRef.current.activeId) {\n return null\n }\n const virtualIndex = stateRef.current.virtualState\n const activeId = stateRef.current.activeId\n const block = virtualIndex.byId.get(activeId)\n if (!block) return null\n\n const parentId = block.parentId ?? null\n const siblings = virtualIndex.byParent.get(parentId) ?? []\n const index = siblings.indexOf(activeId)\n return { parentId, index }\n }, [showDropPreview, stateRef.current.virtualState, stateRef.current.activeId])\n\n // Active block (from original, for drag overlay)\n const activeBlock = stateRef.current.activeId\n ? originalIndex.byId.get(stateRef.current.activeId) ?? null\n : null\n\n // Dragged block for preview ghost\n const draggedBlock = activeBlock\n\n // Handle drag start\n const handleDragStart = useCallback((event: DndKitDragStartEvent) => {\n const id = String(event.active.id)\n const block = blocks.find(b => b.id === id)\n\n if (!block) return\n\n // Check canDrag filter\n if (canDrag && !canDrag(block)) {\n return\n }\n\n // Create event for callback\n const dragEvent: DragStartEvent<T> = {\n block,\n blockId: id,\n }\n\n // Call user callback - can return false to prevent drag\n const result = onDragStart?.(dragEvent)\n if (result === false) {\n return\n }\n\n // Store initial position for move event\n fromPositionRef.current = getBlockPosition(blocks, id)\n\n // Reset sticky collision for fresh drag\n stickyCollisionRef.current.reset()\n\n stateRef.current.activeId = id\n stateRef.current.isDragging = true\n initialBlocksRef.current = [...blocks]\n cachedReorderRef.current = null\n forceRender()\n }, [blocks, canDrag, onDragStart])\n\n // Handle drag move\n const handleDragMove = useCallback((event: DndKitDragMoveEvent) => {\n if (!onDragMove) return\n\n const id = stateRef.current.activeId\n if (!id) return\n\n const block = blocks.find(b => b.id === id)\n if (!block) return\n\n const moveEvent: DragMoveEvent<T> = {\n block,\n blockId: id,\n overZone: stateRef.current.hoverZone,\n coordinates: {\n x: event.delta.x,\n y: event.delta.y,\n },\n }\n\n debouncedDragMove(moveEvent)\n }, [blocks, onDragMove, debouncedDragMove])\n\n // Handle drag over\n const handleDragOver = useCallback((event: DragOverEvent) => {\n if (!event.over) return\n\n const targetZone = String(event.over.id)\n const activeId = stateRef.current.activeId\n\n if (!activeId) return\n\n const activeBlock = blocks.find(b => b.id === activeId)\n const targetBlockId = extractBlockId(targetZone)\n const targetBlock = blocks.find(b => b.id === targetBlockId) ?? null\n\n // Check canDrop filter\n if (canDrop && activeBlock && !canDrop(activeBlock, targetZone, targetBlock)) {\n return\n }\n\n // Fire hover change callback if zone changed\n if (stateRef.current.hoverZone !== targetZone) {\n const zoneType: DropZoneType = getDropZoneType(targetZone)\n\n const hoverEvent: HoverChangeEvent<T> = {\n zoneId: targetZone,\n zoneType,\n targetBlock,\n }\n\n onHoverChange?.(hoverEvent)\n }\n\n stateRef.current.hoverZone = targetZone\n\n // Compute preview from snapshot\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current)\n const updatedIndex = reparentBlockIndex(baseIndex, activeId, targetZone, containerTypes)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes)\n\n // Cache for drag end\n cachedReorderRef.current = { targetId: targetZone, reorderedBlocks: orderedBlocks }\n\n // Debounced preview update (only if enabled)\n if (showDropPreview) {\n debouncedSetVirtual(orderedBlocks)\n }\n }, [blocks, containerTypes, debouncedSetVirtual, canDrop, onHoverChange, showDropPreview])\n\n // Handle drag end\n const handleDragEnd = useCallback((_event: DndKitDragEndEvent) => {\n debouncedSetVirtual.cancel()\n debouncedDragMove.cancel()\n\n const cached = cachedReorderRef.current\n const activeId = stateRef.current.activeId\n const activeBlockData = activeId ? blocks.find(b => b.id === activeId) : null\n\n // Fire drag end callback\n if (activeBlockData) {\n const endEvent: DragEndEvent<T> = {\n block: activeBlockData,\n blockId: activeId!,\n targetZone: cached?.targetId ?? null,\n cancelled: false,\n }\n onDragEnd?.(endEvent)\n }\n\n // Fire block move callback\n if (cached && activeBlockData && fromPositionRef.current) {\n const toPosition = getBlockPosition(cached.reorderedBlocks, activeBlockData.id)\n\n const moveEvent: BlockMoveEvent<T> = {\n block: activeBlockData,\n from: fromPositionRef.current,\n to: toPosition,\n blocks: cached.reorderedBlocks,\n }\n\n onBlockMove?.(moveEvent)\n }\n\n // Reset state\n stateRef.current.activeId = null\n stateRef.current.hoverZone = null\n stateRef.current.virtualState = null\n stateRef.current.isDragging = false\n cachedReorderRef.current = null\n initialBlocksRef.current = []\n fromPositionRef.current = null\n\n // Notify parent of change\n if (cached && onChange) {\n onChange(cached.reorderedBlocks)\n }\n\n forceRender()\n }, [blocks, debouncedSetVirtual, debouncedDragMove, onChange, onDragEnd, onBlockMove])\n\n // Handle drag cancel\n const handleDragCancel = useCallback((_event: DragCancelEvent) => {\n debouncedSetVirtual.cancel()\n debouncedDragMove.cancel()\n\n const activeId = stateRef.current.activeId\n const activeBlockData = activeId ? blocks.find(b => b.id === activeId) : null\n\n // Fire callbacks\n if (activeBlockData) {\n const cancelEvent: DragEndEvent<T> = {\n block: activeBlockData,\n blockId: activeId!,\n targetZone: null,\n cancelled: true,\n }\n onDragCancel?.(cancelEvent)\n onDragEnd?.(cancelEvent)\n }\n\n // Reset state\n stateRef.current.activeId = null\n stateRef.current.hoverZone = null\n stateRef.current.virtualState = null\n stateRef.current.isDragging = false\n cachedReorderRef.current = null\n initialBlocksRef.current = []\n fromPositionRef.current = null\n\n forceRender()\n }, [blocks, debouncedSetVirtual, debouncedDragMove, onDragCancel, onDragEnd])\n\n // Handle hover from drop zones\n const handleHover = useCallback((zoneId: string, _parentId: string | null) => {\n const activeId = stateRef.current.activeId\n if (!activeId) return\n\n const activeBlockData = blocks.find(b => b.id === activeId)\n const targetBlockId = extractBlockId(zoneId)\n const targetBlock = blocks.find(b => b.id === targetBlockId) ?? null\n\n // Check canDrop filter\n if (canDrop && activeBlockData && !canDrop(activeBlockData, zoneId, targetBlock)) {\n return\n }\n\n // Fire hover change callback if zone changed\n if (stateRef.current.hoverZone !== zoneId) {\n const zoneType: DropZoneType = getDropZoneType(zoneId)\n\n const hoverEvent: HoverChangeEvent<T> = {\n zoneId,\n zoneType,\n targetBlock,\n }\n\n onHoverChange?.(hoverEvent)\n }\n\n stateRef.current.hoverZone = zoneId\n\n // Compute preview from snapshot\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current)\n const updatedIndex = reparentBlockIndex(baseIndex, activeId, zoneId, containerTypes)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes)\n\n // Cache for drag end\n cachedReorderRef.current = { targetId: zoneId, reorderedBlocks: orderedBlocks }\n\n // Debounced preview update (only if enabled)\n if (showDropPreview) {\n debouncedSetVirtual(orderedBlocks)\n }\n }, [blocks, containerTypes, debouncedSetVirtual, canDrop, onHoverChange, showDropPreview])\n\n // Handle expand toggle\n const handleToggleExpand = useCallback((id: string) => {\n const newExpanded = stateRef.current.expandedMap[id] === false\n stateRef.current.expandedMap = {\n ...stateRef.current.expandedMap,\n [id]: newExpanded,\n }\n\n // Fire expand change callback\n const block = blocks.find(b => b.id === id)\n if (block && onExpandChange) {\n const expandEvent: ExpandChangeEvent<T> = {\n block,\n blockId: id,\n expanded: newExpanded,\n }\n onExpandChange(expandEvent)\n }\n\n forceRender()\n }, [blocks, onExpandChange])\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection ?? stickyCollisionRef.current}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className={className} style={{ minWidth: 0 }}>\n <TreeRenderer\n blocks={blocks}\n blocksByParent={blocksByParent}\n parentId={null}\n activeId={stateRef.current.activeId}\n expandedMap={stateRef.current.expandedMap}\n renderers={renderers as InternalRenderers<T>}\n containerTypes={containerTypes}\n onHover={handleHover}\n onToggleExpand={handleToggleExpand}\n dropZoneClassName={dropZoneClassName}\n dropZoneActiveClassName={dropZoneActiveClassName}\n indentClassName={indentClassName}\n rootClassName={className}\n canDrag={canDrag}\n previewPosition={previewPosition}\n draggedBlock={draggedBlock}\n />\n </div>\n <DragOverlay activeBlock={activeBlock}>\n {dragOverlay}\n </DragOverlay>\n </DndContext>\n )\n}\n","'use client'\n\nimport {\n createContext,\n useContext,\n useReducer,\n useMemo,\n useCallback,\n type ReactNode,\n} from 'react'\nimport type { UniqueIdentifier } from '@dnd-kit/core'\nimport type { BaseBlock, BlockIndex, BlockAction, BlockStateContextValue, BlockStateProviderProps } from '../core/types'\nimport {\n cloneMap,\n cloneParentMap,\n computeNormalizedIndex,\n reparentBlockIndex,\n deleteBlockAndDescendants,\n} from '../utils/blocks'\nimport { generateId } from '../utils/helper'\n\n/**\n * Block reducer for state management\n */\nfunction blockReducer<T extends BaseBlock>(\n state: BlockIndex<T>,\n action: BlockAction<T>,\n containerTypes: readonly string[] = []\n): BlockIndex<T> {\n switch (action.type) {\n case 'ADD_ITEM': {\n const byId = cloneMap(state.byId)\n const byParent = cloneParentMap(state.byParent)\n const item = action.payload\n\n byId.set(item.id, item)\n\n const parentKey = item.parentId ?? null\n const list = byParent.get(parentKey) ?? []\n\n const insertAt =\n typeof item.order === 'number' && item.order <= list.length\n ? item.order\n : list.length\n\n const newList = [...list]\n newList.splice(insertAt, 0, item.id)\n byParent.set(parentKey, newList)\n\n return { byId, byParent }\n }\n\n case 'INSERT_ITEM': {\n const { item, parentId, index } = action.payload\n const updated = new Map(state.byParent)\n const siblings = [...(updated.get(parentId) ?? [])]\n siblings.splice(index, 0, item.id)\n updated.set(parentId, siblings)\n\n return {\n byId: new Map(state.byId).set(item.id, item),\n byParent: updated,\n }\n }\n\n case 'DELETE_ITEM': {\n return deleteBlockAndDescendants(state, action.payload.id)\n }\n\n case 'SET_ALL': {\n return computeNormalizedIndex(action.payload)\n }\n\n case 'MOVE_ITEM': {\n return reparentBlockIndex(\n state,\n action.payload.activeId,\n action.payload.targetZone,\n containerTypes\n )\n }\n\n default:\n return state\n }\n}\n\n/**\n * Create block state context and hooks\n */\nexport function createBlockState<T extends BaseBlock>() {\n const BlockContext = createContext<BlockStateContextValue<T> | null>(null)\n\n function useBlockState() {\n const ctx = useContext(BlockContext)\n if (!ctx) throw new Error('useBlockState must be used inside BlockStateProvider')\n return ctx\n }\n\n function BlockStateProvider({\n children,\n initialBlocks = [],\n containerTypes = [],\n onChange,\n }: BlockStateProviderProps<T>) {\n const reducerWithContainerTypes = useCallback(\n (state: BlockIndex<T>, action: BlockAction<T>) =>\n blockReducer(state, action, containerTypes),\n [containerTypes]\n )\n\n const [state, dispatch] = useReducer(\n reducerWithContainerTypes,\n computeNormalizedIndex(initialBlocks)\n )\n\n // Compute flat blocks array\n const blocks = useMemo(() => {\n const result: T[] = []\n const walk = (parentId: string | null) => {\n const children = state.byParent.get(parentId) ?? []\n for (let i = 0; i < children.length; i++) {\n const id = children[i]\n const b = state.byId.get(id)\n if (b) {\n result.push({ ...b, order: i })\n if (containerTypes.includes(b.type)) walk(b.id)\n }\n }\n }\n walk(null)\n return result\n }, [state, containerTypes])\n\n // Notify on change\n useMemo(() => {\n onChange?.(blocks)\n }, [blocks, onChange])\n\n const blockMap = useMemo(() => state.byId, [state])\n\n const childrenMap = useMemo(() => {\n const map = new Map<string | null, T[]>()\n for (const [parentId, ids] of state.byParent.entries()) {\n map.set(\n parentId,\n ids.map(id => state.byId.get(id)!).filter(Boolean)\n )\n }\n return map\n }, [state])\n\n const indexMap = useMemo(() => {\n const map = new Map<string, number>()\n for (const ids of state.byParent.values()) {\n ids.forEach((id, index) => {\n map.set(id, index)\n })\n }\n return map\n }, [state])\n\n const createItem = useCallback(\n (type: T['type'], parentId: string | null = null): T => {\n const newItem = {\n id: generateId(),\n type,\n parentId,\n order: 0,\n } as T\n\n dispatch({ type: 'ADD_ITEM', payload: newItem })\n return newItem\n },\n []\n )\n\n const insertItem = useCallback(\n (type: T['type'], referenceId: string, position: 'before' | 'after'): T => {\n const referenceBlock = state.byId.get(referenceId)\n if (!referenceBlock) throw new Error(`Reference block ${referenceId} not found`)\n\n const parentId = referenceBlock.parentId ?? null\n const siblings = state.byParent.get(parentId) ?? []\n const index = siblings.indexOf(referenceId)\n const insertIndex = position === 'before' ? index : index + 1\n\n const newItem = {\n id: generateId(),\n type,\n parentId,\n order: insertIndex,\n } as T\n\n dispatch({\n type: 'INSERT_ITEM',\n payload: { item: newItem, parentId, index: insertIndex },\n })\n\n return newItem\n },\n [state]\n )\n\n const deleteItem = useCallback((id: string) => {\n dispatch({ type: 'DELETE_ITEM', payload: { id } })\n }, [])\n\n const moveItem = useCallback((activeId: UniqueIdentifier, targetZone: string) => {\n dispatch({ type: 'MOVE_ITEM', payload: { activeId, targetZone } })\n }, [])\n\n const setAll = useCallback((all: T[]) => {\n dispatch({ type: 'SET_ALL', payload: all })\n }, [])\n\n const value: BlockStateContextValue<T> = useMemo(\n () => ({\n blocks,\n blockMap,\n childrenMap,\n indexMap,\n normalizedIndex: state,\n createItem,\n insertItem,\n deleteItem,\n moveItem,\n setAll,\n }),\n [\n blocks,\n blockMap,\n childrenMap,\n indexMap,\n state,\n createItem,\n insertItem,\n deleteItem,\n moveItem,\n setAll,\n ]\n )\n\n return <BlockContext.Provider value={value}>{children}</BlockContext.Provider>\n }\n\n return {\n BlockStateProvider,\n useBlockState,\n }\n}\n","'use client'\n\nimport {\n createContext,\n useContext,\n useState,\n useMemo,\n useCallback,\n useReducer,\n useRef,\n useEffect,\n type ReactNode,\n} from 'react'\nimport type { BaseBlock, BlockIndex, TreeStateContextValue, TreeStateProviderProps } from '../core/types'\nimport { computeNormalizedIndex, reparentBlockIndex, buildOrderedBlocks } from '../utils/blocks'\nimport { debounce } from '../utils/helper'\n\ntype ExpandAction =\n | { type: 'TOGGLE'; id: string }\n | { type: 'SET_ALL'; expanded: boolean; ids: string[] }\n\nfunction expandReducer(\n state: Record<string, boolean>,\n action: ExpandAction\n): Record<string, boolean> {\n switch (action.type) {\n case 'TOGGLE':\n return { ...state, [action.id]: !state[action.id] }\n case 'SET_ALL': {\n const newState: Record<string, boolean> = {}\n for (const id of action.ids) {\n newState[id] = action.expanded\n }\n return newState\n }\n default:\n return state\n }\n}\n\ninterface CreateTreeStateOptions<T extends BaseBlock> {\n previewDebounce?: number\n containerTypes?: string[]\n}\n\n/**\n * Create tree state context and hooks\n * Handles UI state: active drag, hover zone, expand/collapse, virtual preview\n */\nexport function createTreeState<T extends BaseBlock>(options: CreateTreeStateOptions<T> = {}) {\n const { previewDebounce = 150, containerTypes = [] } = options\n\n const TreeContext = createContext<TreeStateContextValue<T> | null>(null)\n\n function useTreeState() {\n const ctx = useContext(TreeContext)\n if (!ctx) throw new Error('useTreeState must be used inside TreeStateProvider')\n return ctx\n }\n\n function TreeStateProvider({ children, blocks, blockMap }: TreeStateProviderProps<T>) {\n const [activeId, setActiveId] = useState<string | null>(null)\n const [hoverZone, setHoverZone] = useState<string | null>(null)\n\n // Virtual state for debounced preview\n const [virtualState, setVirtualState] = useState<BlockIndex<T> | null>(null)\n\n // Expand/collapse state\n const [expandedMap, dispatchExpand] = useReducer(expandReducer, {})\n\n // Snapshot-based computation refs\n const initialBlocksRef = useRef<T[]>([])\n const cachedReorderRef = useRef<{ targetId: string; reorderedBlocks: T[] } | null>(null)\n\n // Get active block\n const activeBlock = useMemo(() => {\n if (!activeId) return null\n return blockMap.get(activeId) ?? null\n }, [activeId, blockMap])\n\n // Debounced virtual state setter\n const debouncedSetVirtualBlocks = useMemo(\n () =>\n debounce((newBlocks: T[] | null) => {\n if (!newBlocks) {\n setVirtualState(null)\n } else {\n setVirtualState(computeNormalizedIndex(newBlocks))\n }\n }, previewDebounce),\n [previewDebounce]\n )\n\n // Compute effective state (virtual takes precedence)\n const effectiveState = useMemo(() => {\n return virtualState ?? computeNormalizedIndex(blocks)\n }, [virtualState, blocks])\n\n // Compute effective blocks array\n const effectiveBlocks = useMemo(() => {\n return buildOrderedBlocks(effectiveState, containerTypes)\n }, [effectiveState, containerTypes])\n\n // Blocks by parent for rendering\n const blocksByParent = useMemo(() => {\n const map = new Map<string | null, T[]>()\n for (const [parentId, ids] of effectiveState.byParent.entries()) {\n map.set(\n parentId,\n ids.map(id => effectiveState.byId.get(id)!).filter(Boolean)\n )\n }\n return map\n }, [effectiveState])\n\n // Handle drag start - capture snapshot\n const handleDragStart = useCallback(\n (id: string | null) => {\n setActiveId(id)\n if (id) {\n initialBlocksRef.current = [...blocks]\n cachedReorderRef.current = null\n }\n },\n [blocks]\n )\n\n // Handle drag over - compute preview\n const handleDragOver = useCallback(\n (targetZone: string) => {\n if (!activeId) return\n\n setHoverZone(targetZone)\n\n // Compute preview from snapshot\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current)\n const updatedIndex = reparentBlockIndex(baseIndex, activeId, targetZone, containerTypes)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes)\n\n // Cache for drag end\n cachedReorderRef.current = { targetId: targetZone, reorderedBlocks: orderedBlocks }\n\n // Debounced preview update\n debouncedSetVirtualBlocks(orderedBlocks)\n },\n [activeId, debouncedSetVirtualBlocks, containerTypes]\n )\n\n // Handle drag end - return cached result\n const handleDragEnd = useCallback(() => {\n debouncedSetVirtualBlocks.cancel()\n setVirtualState(null)\n setActiveId(null)\n setHoverZone(null)\n\n const result = cachedReorderRef.current\n cachedReorderRef.current = null\n initialBlocksRef.current = []\n\n return result\n }, [debouncedSetVirtualBlocks])\n\n // Hover handler for drop zones\n const handleHover = useCallback(\n (zoneId: string, _parentId: string | null) => {\n if (!activeId) return\n handleDragOver(zoneId)\n },\n [activeId, handleDragOver]\n )\n\n // Expand/collapse handlers\n const toggleExpand = useCallback((id: string) => {\n dispatchExpand({ type: 'TOGGLE', id })\n }, [])\n\n const setExpandAll = useCallback(\n (expanded: boolean) => {\n const containerIds = blocks.filter(b => containerTypes.includes(b.type)).map(b => b.id)\n dispatchExpand({ type: 'SET_ALL', expanded, ids: containerIds })\n },\n [blocks, containerTypes]\n )\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n debouncedSetVirtualBlocks.cancel()\n }\n }, [debouncedSetVirtualBlocks])\n\n const value: TreeStateContextValue<T> = useMemo(\n () => ({\n activeId,\n activeBlock,\n hoverZone,\n expandedMap,\n effectiveBlocks,\n blocksByParent,\n setActiveId: handleDragStart,\n setHoverZone,\n toggleExpand,\n setExpandAll,\n handleHover,\n }),\n [\n activeId,\n activeBlock,\n hoverZone,\n expandedMap,\n effectiveBlocks,\n blocksByParent,\n handleDragStart,\n toggleExpand,\n setExpandAll,\n handleHover,\n ]\n )\n\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>\n }\n\n return {\n TreeStateProvider,\n useTreeState,\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dnd-block-tree",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A headless React library for building hierarchical drag-and-drop interfaces",
5
5
  "author": "sandybridge",
6
6
  "main": "./dist/index.js",
@@ -28,8 +28,8 @@
28
28
  "peerDependencies": {
29
29
  "@dnd-kit/core": "^6.0.0",
30
30
  "@dnd-kit/utilities": "^3.0.0",
31
- "react": "^18.0.0",
32
- "react-dom": "^18.0.0"
31
+ "react": "^18.0.0 || ^19.0.0",
32
+ "react-dom": "^18.0.0 || ^19.0.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@dnd-kit/core": "^6.3.1",