dnd-block-tree 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -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":["useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","useDroppable","useCallback","useEffect","jsx","memo","useDraggable","jsxs","Fragment","DndKitDragOverlay","useMemo","useRef","useReducer","activeBlock","DndContext","createContext","useContext","state","children","useState"],"mappings":"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","file":"index.js","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/fractional.ts","../src/utils/blocks.ts","../src/components/BlockTree.tsx","../src/hooks/useBlockState.tsx","../src/hooks/useTreeState.tsx","../src/hooks/useBlockHistory.tsx"],"names":["useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","useDroppable","useCallback","useEffect","jsx","memo","useDraggable","jsxs","Fragment","DndKitDragOverlay","useMemo","useRef","useReducer","activeBlock","baseIndex","DndContext","createContext","useContext","state","children","useState"],"mappings":"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","file":"index.js","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 /** Ordering value. Number for integer ordering (default), string for fractional ordering. */\n order: number | string\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 /** IDs of all blocks that were moved (for multi-select) */\n movedIds: string[]\n}\n\n/**\n * A pending move operation passed through the onBeforeMove middleware pipeline.\n * Return a modified operation to transform the move, or return false to cancel.\n */\nexport interface MoveOperation<T extends BaseBlock = BaseBlock> {\n /** The block being moved */\n block: T\n /** Position before the move */\n from: BlockPosition\n /** Target drop zone ID */\n targetZone: string\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 a block is added\n */\nexport interface BlockAddEvent<T extends BaseBlock = BaseBlock> {\n block: T\n parentId: string | null\n index: number\n}\n\n/**\n * Event fired when a block (and optionally its descendants) is deleted\n */\nexport interface BlockDeleteEvent<T extends BaseBlock = BaseBlock> {\n block: T\n deletedIds: string[]\n parentId: string | null\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 /**\n * Called before a block move is committed. Return a modified MoveOperation to\n * transform the move (e.g. change the target zone), or return false to cancel.\n * Return void / undefined to allow the move as-is.\n */\n onBeforeMove?: (operation: MoveOperation<T>) => MoveOperation<T> | false | 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 /** Called after a block is added */\n onBlockAdd?: (event: BlockAddEvent<T>) => void\n /** Called after a block (and its descendants) is deleted */\n onBlockDelete?: (event: BlockDeleteEvent<T>) => void\n}\n\n// ============================================================================\n// Customization Types\n// ============================================================================\n\n/**\n * Ordering strategy for block siblings.\n *\n * - `'integer'` (default): siblings are reindexed 0, 1, 2, … after every move.\n * Simple and efficient; not suitable for collaborative/CRDT scenarios.\n * - `'fractional'`: each move only updates the moved block's `order` with a\n * lexicographically sortable string key (fractional index). Siblings are never\n * reindexed, making it conflict-free for concurrent edits.\n */\nexport type OrderingStrategy = 'integer' | 'fractional'\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 * Ordering strategy for block siblings.\n * Defaults to `'integer'` (reindex all siblings on every move).\n * Use `'fractional'` for CRDT-compatible collaborative editing.\n */\n orderingStrategy?: OrderingStrategy\n /** Maximum nesting depth (1 = flat list, 2 = one level of nesting, etc.) */\n maxDepth?: number\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 orderingStrategy?: OrderingStrategy\n maxDepth?: number\n onBlockAdd?: (event: BlockAddEvent<T>) => void\n onBlockDelete?: (event: BlockDeleteEvent<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 /** Currently focused block ID for keyboard navigation */\n focusedId?: string | null\n /** Currently selected block IDs for multi-select */\n selectedIds?: Set<string>\n /** Click handler for multi-select */\n onBlockClick?: (blockId: string, event: React.MouseEvent) => void\n}\n\n/**\n * Draggable wrapper for individual blocks\n */\nfunction DraggableBlock<T extends BaseBlock>({\n block,\n children,\n disabled,\n focusedId,\n isSelected,\n onBlockClick,\n}: {\n block: T\n children: (props: { isDragging: boolean }) => ReactNode\n disabled?: boolean\n focusedId?: string | null\n isSelected?: boolean\n onBlockClick?: (blockId: string, event: React.MouseEvent) => void\n}) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: block.id,\n disabled,\n })\n\n const isFocused = focusedId === block.id\n\n return (\n <div\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n data-block-id={block.id}\n tabIndex={isFocused ? 0 : -1}\n onClick={onBlockClick ? (e: React.MouseEvent) => onBlockClick(block.id, e) : undefined}\n data-selected={isSelected || undefined}\n style={{ touchAction: 'none', minWidth: 0, outline: 'none' }}\n role=\"treeitem\"\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 focusedId,\n selectedIds,\n onBlockClick,\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\n block={block}\n disabled={isDragDisabled}\n focusedId={focusedId}\n isSelected={selectedIds?.has(block.id)}\n onBlockClick={onBlockClick}\n >\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 focusedId={focusedId}\n selectedIds={selectedIds}\n onBlockClick={onBlockClick}\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 /** Number of selected items being dragged (for multi-select badge) */\n selectedCount?: number\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 selectedCount = 0,\n}: DragOverlayProps<T>) {\n const showBadge = selectedCount > 1\n return (\n <DndKitDragOverlay>\n {activeBlock && (\n <div style={{ position: 'relative' }}>\n {showBadge && (\n <>\n {/* Stacked card effect */}\n <div\n style={{\n position: 'absolute',\n top: 4,\n left: 4,\n right: -4,\n bottom: -4,\n borderRadius: 8,\n border: '1px solid #d1d5db',\n background: '#f3f4f6',\n opacity: 0.6,\n zIndex: -1,\n }}\n />\n {/* Count badge */}\n <div\n style={{\n position: 'absolute',\n top: -8,\n right: -8,\n background: '#3b82f6',\n color: 'white',\n borderRadius: '50%',\n width: 22,\n height: 22,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n zIndex: 10,\n boxShadow: '0 1px 3px rgba(0,0,0,0.2)',\n }}\n >\n {selectedCount}\n </div>\n </>\n )}\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 </div>\n )}\n </DndKitDragOverlay>\n )\n}\n","/**\n * Fractional indexing utilities\n *\n * Generates lexicographically sortable string keys that allow insertion between\n * any two existing keys without reindexing siblings. Suitable for CRDT-based\n * collaborative editing.\n *\n * Alphabet: 0-9a-z (base 36). Lexicographic order matches semantic order since\n * '0' < '1' < ... < '9' < 'a' < ... < 'z' in ASCII.\n */\n\nconst ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz'\nconst BASE = ALPHABET.length // 36\nconst FLOOR = ALPHABET[0] // '0' — padding / before-operation prefix\nconst MID_IDX = Math.floor(BASE / 2) // 18\nconst MID_CHAR = ALPHABET[MID_IDX] // 'i'\n\nfunction charToIdx(c: string): number {\n const n = ALPHABET.indexOf(c)\n if (n === -1) throw new Error(`Invalid fractional key character: \"${c}\"`)\n return n\n}\n\n/**\n * Compute the arithmetic midpoint of two strings using digit-by-digit base-36\n * arithmetic (avoids BigInt for broader target compatibility).\n *\n * Both are conceptually padded to (max_length + 1) digits. The extra digit\n * ensures the sum is always ≥ 2, so integer division always yields a midpoint\n * strictly greater than lo.\n */\nfunction computeMidpoint(lo: string, hi: string): string {\n const len = Math.max(lo.length, hi.length) + 1\n\n const loD = Array.from(lo.padEnd(len, FLOOR)).map(charToIdx)\n const hiD = Array.from(hi.padEnd(len, FLOOR)).map(charToIdx)\n\n // Sum into a (len+1)-digit buffer to absorb the carry from position 0\n const sum = new Array<number>(len + 1).fill(0)\n let carry = 0\n for (let i = len - 1; i >= 0; i--) {\n const s = loD[i] + hiD[i] + carry\n sum[i + 1] = s % BASE\n carry = Math.floor(s / BASE)\n }\n sum[0] = carry\n\n // Halve the (len+1)-digit sum\n const mid = new Array<number>(len + 1).fill(0)\n let rem = 0\n for (let i = 0; i <= len; i++) {\n const val = rem * BASE + sum[i]\n mid[i] = Math.floor(val / 2)\n rem = val % 2\n }\n\n // mid[0] is always 0 because (lo + hi) / 2 < BASE^len\n // Drop it, then trim trailing FLOOR digits\n const digits = mid.slice(1)\n let end = digits.length\n while (end > 1 && digits[end - 1] === 0) end--\n\n return digits.slice(0, end).map(n => ALPHABET[n]).join('')\n}\n\n/**\n * Generate a key that sorts strictly before `hi`.\n */\nfunction keyBefore(hi: string): string {\n const firstIdx = charToIdx(hi[0])\n if (firstIdx > 1) {\n return ALPHABET[Math.floor(firstIdx / 2)]\n }\n // hi starts with '0' or '1' — recurse with FLOOR prefix\n if (hi.length === 1) {\n return FLOOR + MID_CHAR\n }\n return FLOOR + keyBefore(hi.slice(1))\n}\n\n/**\n * Generate a key that sorts strictly between `lo` and `hi`.\n *\n * @param lo - Lower bound (null means no lower bound)\n * @param hi - Upper bound (null means no upper bound)\n */\nexport function generateKeyBetween(lo: string | null, hi: string | null): string {\n if (lo !== null && hi !== null) {\n if (lo >= hi) throw new Error(`lo must be strictly less than hi: \"${lo}\" >= \"${hi}\"`)\n return computeMidpoint(lo, hi)\n }\n if (lo === null && hi === null) return MID_CHAR\n if (lo === null) return keyBefore(hi!)\n // hi === null: append MID_CHAR so result sorts after lo\n return lo + MID_CHAR\n}\n\n/**\n * Generate `n` evenly distributed keys between `lo` and `hi` using binary\n * subdivision. Keys grow at O(log n) depth, avoiding unbounded length.\n *\n * @param lo - Lower bound (null means no lower bound)\n * @param hi - Upper bound (null means no upper bound)\n * @param n - Number of keys to generate\n */\nexport function generateNKeysBetween(\n lo: string | null,\n hi: string | null,\n n: number\n): string[] {\n if (n <= 0) return []\n if (n === 1) return [generateKeyBetween(lo, hi)]\n\n const keys: string[] = new Array(n)\n\n function fill(loKey: string | null, hiKey: string | null, from: number, to: number) {\n if (from >= to) return\n const mid = Math.floor((from + to) / 2)\n keys[mid] = generateKeyBetween(loKey, hiKey)\n fill(loKey, keys[mid], from, mid)\n fill(keys[mid], hiKey, mid + 1, to)\n }\n\n fill(lo, hi, 0, n)\n return keys\n}\n\n/**\n * Generate initial keys for `n` items starting from an empty list.\n */\nexport function generateInitialKeys(n: number): string[] {\n return generateNKeysBetween(null, null, n)\n}\n\n/**\n * Compare two fractional keys lexicographically.\n * Returns negative if a < b, positive if a > b, 0 if equal.\n */\nexport function compareFractionalKeys(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\n/**\n * Assign initial fractional `order` keys to a flat array of blocks.\n *\n * Groups siblings by `parentId`, sorts each group by existing `order`, then\n * assigns evenly-distributed fractional keys via binary subdivision.\n *\n * Use this to migrate an integer-ordered (or unkeyed) dataset to fractional\n * ordering before passing blocks to a `BlockTree` with `orderingStrategy=\"fractional\"`.\n */\nexport function initFractionalOrder<T extends { id: string; parentId: string | null; order: number | string }>(\n blocks: T[]\n): T[] {\n const byParent = new Map<string | null, T[]>()\n for (const block of blocks) {\n const key = block.parentId ?? null\n const list = byParent.get(key) ?? []\n list.push(block)\n byParent.set(key, list)\n }\n\n const updated = new Map<string, T>()\n for (const siblings of byParent.values()) {\n siblings.sort((a, b) => {\n const ao = a.order, bo = b.order\n if (typeof ao === 'number' && typeof bo === 'number') return ao - bo\n return String(ao) < String(bo) ? -1 : String(ao) > String(bo) ? 1 : 0\n })\n const keys = generateNKeysBetween(null, null, siblings.length)\n siblings.forEach((block, i) => {\n updated.set(block.id, { ...block, order: keys[i] })\n })\n }\n\n return blocks.map(b => updated.get(b.id) ?? b)\n}\n","import type { UniqueIdentifier } from '@dnd-kit/core'\nimport type { BaseBlock, BlockIndex, OrderingStrategy } from '../core/types'\nimport { extractUUID } from './helper'\nimport { generateKeyBetween, compareFractionalKeys } from './fractional'\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 *\n * With `orderingStrategy: 'fractional'`, siblings are sorted by their `order`\n * field (lexicographic). With `'integer'` (default), the input order is preserved.\n */\nexport function computeNormalizedIndex<T extends BaseBlock>(\n blocks: T[],\n orderingStrategy: OrderingStrategy = 'integer'\n): 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 if (orderingStrategy === 'fractional') {\n for (const [parentId, ids] of byParent.entries()) {\n ids.sort((a, b) => {\n const orderA = String(byId.get(a)!.order)\n const orderB = String(byId.get(b)!.order)\n return compareFractionalKeys(orderA, orderB)\n })\n byParent.set(parentId, ids)\n }\n }\n\n return { byId, byParent }\n}\n\n/**\n * Build ordered flat array from BlockIndex.\n *\n * With `'integer'` ordering (default), assigns sequential `order: 0, 1, 2, …`.\n * With `'fractional'` ordering, preserves existing `order` values — the moved\n * block already has its new fractional key set by `reparentBlockIndex`.\n */\nexport function buildOrderedBlocks<T extends BaseBlock>(\n index: BlockIndex<T>,\n containerTypes: readonly string[] = [],\n orderingStrategy: OrderingStrategy = 'integer'\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(orderingStrategy === 'fractional' ? block : { ...block, order: i })\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 * @param orderingStrategy - Whether to assign a fractional key to the moved block\n */\nexport function reparentBlockIndex<T extends BaseBlock>(\n state: BlockIndex<T>,\n activeId: UniqueIdentifier,\n targetZone: string,\n containerTypes: readonly string[] = [],\n orderingStrategy: OrderingStrategy = 'integer',\n maxDepth?: number\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 // Enforce maxDepth: parentDepth + subtreeDepth of dragged must not exceed limit\n if (maxDepth != null) {\n const parentDepth = newParentId !== null ? getBlockDepth(state, newParentId) : 0\n const subtreeDepth = getSubtreeDepth(state, dragged.id)\n if (parentDepth + subtreeDepth > maxDepth) return state\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 // Compute new order value\n let newOrder: number | string = dragged.order\n if (orderingStrategy === 'fractional') {\n const siblings = newList\n const movedIdx = siblings.indexOf(dragged.id)\n const prevId = movedIdx > 0 ? siblings[movedIdx - 1] : null\n const nextId = movedIdx < siblings.length - 1 ? siblings[movedIdx + 1] : null\n const prevOrder = prevId ? String(byId.get(prevId)!.order) : null\n const nextOrder = nextId ? String(byId.get(nextId)!.order) : null\n newOrder = generateKeyBetween(prevOrder, nextOrder)\n }\n\n byId.set(dragged.id, {\n ...dragged,\n parentId: newParentId,\n order: newOrder,\n })\n\n return { byId, byParent }\n}\n\n/**\n * Compute the depth of a block by walking its parentId chain.\n * Root-level blocks have depth 1.\n */\nexport function getBlockDepth<T extends BaseBlock>(\n index: BlockIndex<T>,\n blockId: string\n): number {\n let depth = 0\n let current: string | null = blockId\n while (current !== null) {\n depth++\n const block = index.byId.get(current)\n current = block?.parentId ?? null\n }\n return depth\n}\n\n/**\n * Compute the maximum depth of a subtree rooted at blockId (inclusive).\n * A leaf block returns 1.\n */\nexport function getSubtreeDepth<T extends BaseBlock>(\n index: BlockIndex<T>,\n blockId: string\n): number {\n const children = index.byParent.get(blockId) ?? []\n if (children.length === 0) return 1\n let max = 0\n for (const childId of children) {\n max = Math.max(max, getSubtreeDepth(index, childId))\n }\n return 1 + max\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 * Reparent multiple blocks to a target zone, preserving their relative order.\n * The first block in `blockIds` is treated as the primary (anchor) block.\n */\nexport function reparentMultipleBlocks<T extends BaseBlock>(\n state: BlockIndex<T>,\n blockIds: string[],\n targetZone: string,\n containerTypes: readonly string[] = [],\n orderingStrategy: OrderingStrategy = 'integer',\n maxDepth?: number\n): BlockIndex<T> {\n if (blockIds.length === 0) return state\n if (blockIds.length === 1) {\n return reparentBlockIndex(state, blockIds[0], targetZone, containerTypes, orderingStrategy, maxDepth)\n }\n\n // Move the primary block first\n let result = reparentBlockIndex(state, blockIds[0], targetZone, containerTypes, orderingStrategy, maxDepth)\n if (result === state) return state // move was rejected\n\n // Move remaining blocks after the primary, preserving relative order\n for (let i = 1; i < blockIds.length; i++) {\n result = reparentBlockIndex(result, blockIds[i], `after-${blockIds[i - 1]}`, containerTypes, orderingStrategy, maxDepth)\n }\n\n return result\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, useEffect, type ReactNode, type KeyboardEvent } 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 MoveOperation,\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 reparentMultipleBlocks,\n buildOrderedBlocks,\n getBlockDepth,\n getSubtreeDepth,\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 /** Enable keyboard navigation with arrow keys (default: false) */\n keyboardNavigation?: boolean\n /** Enable multi-select with Cmd/Ctrl+Click and Shift+Click (default: false) */\n multiSelect?: boolean\n /** Externally-controlled selected IDs (for multi-select) */\n selectedIds?: Set<string>\n /** Called when selection changes (for multi-select) */\n onSelectionChange?: (selectedIds: Set<string>) => void\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 * Build a flat list of visible block IDs respecting expand state.\n */\nfunction getVisibleBlockIds<T extends BaseBlock>(\n blocksByParent: Map<string | null, T[]>,\n containerTypes: readonly string[],\n expandedMap: Record<string, boolean>,\n parentId: string | null = null\n): string[] {\n const result: string[] = []\n const children = blocksByParent.get(parentId) ?? []\n for (const block of children) {\n result.push(block.id)\n if (containerTypes.includes(block.type) && expandedMap[block.id] !== false) {\n result.push(...getVisibleBlockIds(blocksByParent, containerTypes, expandedMap, block.id))\n }\n }\n return result\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 onBeforeMove,\n onBlockMove,\n onExpandChange,\n onHoverChange,\n // Customization\n canDrag,\n canDrop,\n collisionDetection,\n sensors: sensorConfig,\n initialExpanded,\n orderingStrategy = 'integer',\n maxDepth,\n keyboardNavigation = false,\n multiSelect = false,\n selectedIds: externalSelectedIds,\n onSelectionChange,\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 // IDs being dragged (for multi-select, sorted by visible order)\n const draggedIdsRef = useRef<string[]>([])\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, orderingStrategy)\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 // --- Keyboard navigation ---\n const focusedIdRef = useRef<string | null>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const lastClickedIdRef = useRef<string | null>(null)\n\n // Internal selectedIds state (when not externally controlled)\n const [internalSelectedIds, setInternalSelectedIds] = useReducer(\n (_: Set<string>, next: Set<string>) => next,\n new Set<string>()\n )\n const selectedIds = externalSelectedIds ?? internalSelectedIds\n const setSelectedIds = useCallback((ids: Set<string>) => {\n if (onSelectionChange) {\n onSelectionChange(ids)\n } else {\n setInternalSelectedIds(ids)\n }\n }, [onSelectionChange])\n\n // Visible block IDs for keyboard nav and shift-click range\n const visibleBlockIds = useMemo(\n () => getVisibleBlockIds(blocksByParent, containerTypes, stateRef.current.expandedMap),\n [blocksByParent, containerTypes, stateRef.current.expandedMap]\n )\n\n // Focus a block by ID\n const focusBlock = useCallback((id: string | null) => {\n focusedIdRef.current = id\n if (id && rootRef.current) {\n const el = rootRef.current.querySelector(`[data-block-id=\"${id}\"]`) as HTMLElement | null\n el?.focus()\n }\n forceRender()\n }, [])\n\n // Ref for toggle expand (resolved later in hook order)\n const toggleExpandRef = useRef<(id: string) => void>(() => {})\n\n // Keyboard handler\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (!keyboardNavigation) return\n\n const currentId = focusedIdRef.current\n const currentIndex = currentId ? visibleBlockIds.indexOf(currentId) : -1\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault()\n const nextIndex = currentIndex < visibleBlockIds.length - 1 ? currentIndex + 1 : currentIndex\n focusBlock(visibleBlockIds[nextIndex] ?? null)\n break\n }\n case 'ArrowUp': {\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : 0\n focusBlock(visibleBlockIds[prevIndex] ?? null)\n break\n }\n case 'ArrowRight': {\n event.preventDefault()\n if (currentId) {\n const block = originalIndex.byId.get(currentId)\n if (block && containerTypes.includes(block.type)) {\n if (stateRef.current.expandedMap[currentId] === false) {\n toggleExpandRef.current(currentId)\n } else {\n const children = blocksByParent.get(currentId) ?? []\n if (children.length > 0) focusBlock(children[0].id)\n }\n }\n }\n break\n }\n case 'ArrowLeft': {\n event.preventDefault()\n if (currentId) {\n const block = originalIndex.byId.get(currentId)\n if (block && containerTypes.includes(block.type) && stateRef.current.expandedMap[currentId] !== false) {\n toggleExpandRef.current(currentId)\n } else if (block?.parentId) {\n focusBlock(block.parentId)\n }\n }\n break\n }\n case 'Enter':\n case ' ': {\n event.preventDefault()\n if (currentId) {\n const block = originalIndex.byId.get(currentId)\n if (block && containerTypes.includes(block.type)) {\n toggleExpandRef.current(currentId)\n }\n }\n break\n }\n case 'Home': {\n event.preventDefault()\n if (visibleBlockIds.length > 0) focusBlock(visibleBlockIds[0])\n break\n }\n case 'End': {\n event.preventDefault()\n if (visibleBlockIds.length > 0) focusBlock(visibleBlockIds[visibleBlockIds.length - 1])\n break\n }\n }\n }, [keyboardNavigation, visibleBlockIds, focusBlock, originalIndex, containerTypes, blocksByParent])\n\n // Block click handler for selection\n const handleBlockClick = useCallback((blockId: string, event: React.MouseEvent) => {\n if (!multiSelect) return\n\n if (event.metaKey || event.ctrlKey) {\n // Toggle single block\n const next = new Set(selectedIds)\n if (next.has(blockId)) {\n next.delete(blockId)\n } else {\n next.add(blockId)\n }\n setSelectedIds(next)\n } else if (event.shiftKey && lastClickedIdRef.current) {\n // Range select\n const startIdx = visibleBlockIds.indexOf(lastClickedIdRef.current)\n const endIdx = visibleBlockIds.indexOf(blockId)\n if (startIdx !== -1 && endIdx !== -1) {\n const [from, to] = startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx]\n const next = new Set(selectedIds)\n for (let i = from; i <= to; i++) {\n next.add(visibleBlockIds[i])\n }\n setSelectedIds(next)\n }\n } else {\n setSelectedIds(new Set([blockId]))\n }\n lastClickedIdRef.current = blockId\n }, [multiSelect, selectedIds, setSelectedIds, visibleBlockIds])\n\n // Focus management via useEffect\n useEffect(() => {\n if (!keyboardNavigation || !focusedIdRef.current || !rootRef.current) return\n const el = rootRef.current.querySelector(`[data-block-id=\"${focusedIdRef.current}\"]`) as HTMLElement | null\n el?.focus()\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 // Determine which blocks are being dragged (multi-select aware)\n if (multiSelect && selectedIds.has(id)) {\n // Drag all selected, sorted by visible order\n draggedIdsRef.current = visibleBlockIds.filter(vid => selectedIds.has(vid))\n } else {\n draggedIdsRef.current = [id]\n if (multiSelect) {\n // Clear selection when dragging an unselected block\n setSelectedIds(new Set([id]))\n }\n }\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, multiSelect, selectedIds, setSelectedIds, visibleBlockIds])\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 // Check maxDepth constraint\n if (maxDepth != null && activeBlock) {\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current, orderingStrategy)\n const testResult = reparentBlockIndex(baseIndex, activeId, targetZone, containerTypes, orderingStrategy, maxDepth)\n if (testResult === baseIndex) return // maxDepth would be exceeded\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, orderingStrategy)\n const ids = draggedIdsRef.current\n const updatedIndex = ids.length > 1\n ? reparentMultipleBlocks(baseIndex, ids, targetZone, containerTypes, orderingStrategy, maxDepth)\n : reparentBlockIndex(baseIndex, activeId, targetZone, containerTypes, orderingStrategy, maxDepth)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes, orderingStrategy)\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, maxDepth, orderingStrategy])\n\n // Handle drag end\n const handleDragEnd = useCallback((_event: DndKitDragEndEvent) => {\n debouncedSetVirtual.cancel()\n debouncedDragMove.cancel()\n\n let cached = cachedReorderRef.current\n const activeId = stateRef.current.activeId\n const activeBlockData = activeId ? blocks.find(b => b.id === activeId) : null\n\n // Run onBeforeMove middleware before committing the move\n if (cached && activeBlockData && fromPositionRef.current && onBeforeMove) {\n const operation: MoveOperation<T> = {\n block: activeBlockData,\n from: fromPositionRef.current,\n targetZone: cached.targetId,\n }\n const result = onBeforeMove(operation)\n\n if (result === false) {\n // Move cancelled by middleware\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 forceRender()\n return\n }\n\n if (result && result.targetZone !== cached.targetId) {\n // Middleware changed the target zone — recompute\n const baseIndex = computeNormalizedIndex(initialBlocksRef.current, orderingStrategy)\n const ids = draggedIdsRef.current\n const updatedIndex = ids.length > 1\n ? reparentMultipleBlocks(baseIndex, ids, result.targetZone, containerTypes, orderingStrategy, maxDepth)\n : reparentBlockIndex(baseIndex, activeId!, result.targetZone, containerTypes, orderingStrategy, maxDepth)\n const reorderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes, orderingStrategy)\n cached = { targetId: result.targetZone, reorderedBlocks }\n }\n }\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 movedIds: [...draggedIdsRef.current],\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 draggedIdsRef.current = []\n\n // Notify parent of change\n if (cached && onChange) {\n onChange(cached.reorderedBlocks)\n }\n\n forceRender()\n }, [blocks, containerTypes, orderingStrategy, debouncedSetVirtual, debouncedDragMove, onChange, onDragEnd, onBlockMove, onBeforeMove])\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 draggedIdsRef.current = []\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 // Check maxDepth constraint\n if (maxDepth != null && activeBlockData) {\n const baseIdx = computeNormalizedIndex(initialBlocksRef.current, orderingStrategy)\n const testResult = reparentBlockIndex(baseIdx, activeId, zoneId, containerTypes, orderingStrategy, maxDepth)\n if (testResult === baseIdx) 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, orderingStrategy)\n const ids = draggedIdsRef.current\n const updatedIndex = ids.length > 1\n ? reparentMultipleBlocks(baseIndex, ids, zoneId, containerTypes, orderingStrategy, maxDepth)\n : reparentBlockIndex(baseIndex, activeId, zoneId, containerTypes, orderingStrategy, maxDepth)\n const orderedBlocks = buildOrderedBlocks(updatedIndex, containerTypes, orderingStrategy)\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, orderingStrategy, debouncedSetVirtual, canDrop, onHoverChange, showDropPreview, maxDepth])\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 // Keep ref in sync for keyboard handler\n toggleExpandRef.current = handleToggleExpand\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\n ref={rootRef}\n className={className}\n style={{ minWidth: 0 }}\n onKeyDown={keyboardNavigation ? handleKeyDown : undefined}\n role={keyboardNavigation ? 'tree' : undefined}\n >\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 focusedId={keyboardNavigation ? focusedIdRef.current : undefined}\n selectedIds={multiSelect ? selectedIds : undefined}\n onBlockClick={multiSelect ? handleBlockClick : undefined}\n />\n </div>\n <DragOverlay activeBlock={activeBlock} selectedCount={multiSelect ? selectedIds.size : 0}>\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, BlockAddEvent, BlockDeleteEvent, OrderingStrategy } from '../core/types'\nimport {\n cloneMap,\n cloneParentMap,\n computeNormalizedIndex,\n reparentBlockIndex,\n deleteBlockAndDescendants,\n getDescendantIds,\n} from '../utils/blocks'\nimport { generateId } from '../utils/helper'\nimport { generateKeyBetween } from '../utils/fractional'\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 orderingStrategy: OrderingStrategy = 'integer',\n maxDepth?: number\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 orderingStrategy,\n maxDepth\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 orderingStrategy = 'integer',\n maxDepth,\n onBlockAdd,\n onBlockDelete,\n }: BlockStateProviderProps<T>) {\n const reducerWithOptions = useCallback(\n (state: BlockIndex<T>, action: BlockAction<T>) =>\n blockReducer(state, action, containerTypes, orderingStrategy, maxDepth),\n [containerTypes, orderingStrategy, maxDepth]\n )\n\n const [state, dispatch] = useReducer(\n reducerWithOptions,\n computeNormalizedIndex(initialBlocks, orderingStrategy)\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(orderingStrategy === 'fractional' ? b : { ...b, order: i })\n if (containerTypes.includes(b.type)) walk(b.id)\n }\n }\n }\n walk(null)\n return result\n }, [state, containerTypes, orderingStrategy])\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 siblings = state.byParent.get(parentId) ?? []\n let order: number | string = siblings.length\n if (orderingStrategy === 'fractional') {\n const lastId = siblings[siblings.length - 1]\n const lastOrder = lastId ? String(state.byId.get(lastId)!.order) : null\n order = generateKeyBetween(lastOrder, null)\n }\n\n const newItem = { id: generateId(), type, parentId, order } as T\n dispatch({ type: 'ADD_ITEM', payload: newItem })\n onBlockAdd?.({ block: newItem, parentId, index: siblings.length })\n return newItem\n },\n [state, orderingStrategy, onBlockAdd]\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 let order: number | string = insertIndex\n if (orderingStrategy === 'fractional') {\n const prevId = insertIndex > 0 ? siblings[insertIndex - 1] : null\n const nextId = insertIndex < siblings.length ? siblings[insertIndex] : null\n const prevOrder = prevId ? String(state.byId.get(prevId)!.order) : null\n const nextOrder = nextId ? String(state.byId.get(nextId)!.order) : null\n order = generateKeyBetween(prevOrder, nextOrder)\n }\n\n const newItem = { id: generateId(), type, parentId, order } as T\n\n dispatch({\n type: 'INSERT_ITEM',\n payload: { item: newItem, parentId, index: insertIndex },\n })\n\n onBlockAdd?.({ block: newItem, parentId, index: insertIndex })\n return newItem\n },\n [state, orderingStrategy, onBlockAdd]\n )\n\n const deleteItem = useCallback((id: string) => {\n const block = state.byId.get(id)\n if (block && onBlockDelete) {\n const deletedIds = [...getDescendantIds(state, id)]\n onBlockDelete({ block, deletedIds, parentId: block.parentId })\n }\n dispatch({ type: 'DELETE_ITEM', payload: { id } })\n }, [state, onBlockDelete])\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","'use client'\n\nimport { useReducer, useCallback } from 'react'\nimport type { BaseBlock } from '../core/types'\n\nexport interface UseBlockHistoryOptions {\n /** Maximum number of undo steps to retain (default: 50) */\n maxSteps?: number\n}\n\nexport interface UseBlockHistoryResult<T extends BaseBlock> {\n /** Current blocks state */\n blocks: T[]\n /** Set new blocks state (pushes current to undo stack) */\n set: (blocks: T[]) => void\n /** Undo the last change */\n undo: () => void\n /** Redo the last undone change */\n redo: () => void\n /** Whether undo is available */\n canUndo: boolean\n /** Whether redo is available */\n canRedo: boolean\n}\n\ninterface HistoryState<T extends BaseBlock> {\n past: T[][]\n present: T[]\n future: T[][]\n}\n\ntype HistoryAction<T extends BaseBlock> =\n | { type: 'SET'; payload: T[]; maxSteps: number }\n | { type: 'UNDO' }\n | { type: 'REDO' }\n\nfunction historyReducer<T extends BaseBlock>(\n state: HistoryState<T>,\n action: HistoryAction<T>\n): HistoryState<T> {\n switch (action.type) {\n case 'SET': {\n const past = [...state.past, state.present]\n if (past.length > action.maxSteps) {\n past.shift()\n }\n return {\n past,\n present: action.payload,\n future: [],\n }\n }\n case 'UNDO': {\n if (state.past.length === 0) return state\n const previous = state.past[state.past.length - 1]\n return {\n past: state.past.slice(0, -1),\n present: previous,\n future: [state.present, ...state.future],\n }\n }\n case 'REDO': {\n if (state.future.length === 0) return state\n const next = state.future[0]\n return {\n past: [...state.past, state.present],\n present: next,\n future: state.future.slice(1),\n }\n }\n default:\n return state\n }\n}\n\n/**\n * Composable hook for undo/redo support with BlockTree.\n *\n * Usage:\n * ```tsx\n * const { blocks, set, undo, redo, canUndo, canRedo } = useBlockHistory(initialBlocks)\n * <BlockTree blocks={blocks} onChange={set} />\n * <button onClick={undo} disabled={!canUndo}>Undo</button>\n * <button onClick={redo} disabled={!canRedo}>Redo</button>\n * ```\n */\nexport function useBlockHistory<T extends BaseBlock>(\n initialBlocks: T[],\n options: UseBlockHistoryOptions = {}\n): UseBlockHistoryResult<T> {\n const { maxSteps = 50 } = options\n\n const [state, dispatch] = useReducer(historyReducer<T>, {\n past: [],\n present: initialBlocks,\n future: [],\n })\n\n const set = useCallback(\n (blocks: T[]) => dispatch({ type: 'SET', payload: blocks, maxSteps }),\n [maxSteps]\n )\n const undo = useCallback(() => dispatch({ type: 'UNDO' }), [])\n const redo = useCallback(() => dispatch({ type: 'REDO' }), [])\n\n return {\n blocks: state.present,\n set,\n undo,\n redo,\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n }\n}\n"]}