dnd-block-tree 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/types.ts","../src/core/collision.ts","../src/core/sensors.ts","../src/utils/helper.ts","../src/components/DropZone.tsx","../src/components/TreeRenderer.tsx","../src/components/DragOverlay.tsx","../src/utils/fractional.ts","../src/utils/blocks.ts","../src/components/BlockTree.tsx","../src/components/BlockTreeSSR.tsx","../src/hooks/useBlockState.tsx","../src/hooks/useTreeState.tsx","../src/hooks/useBlockHistory.tsx","../src/hooks/useLayoutAnimation.tsx","../src/hooks/useVirtualTree.tsx","../src/components/BlockTreeDevTools.tsx","../src/utils/serialization.ts"],"names":["jsx","memo","DndKitDragOverlay","jsxs","Fragment","expandedMap","containers","useCallback","useEffect","activeBlock","baseIndex","useState","state","useReducer","useMemo","children","createContext","useContext","useRef"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ReactNode } from 'react'\nimport type { UniqueIdentifier, CollisionDetection } from '@dnd-kit/core'\n\n/**\n * Base block interface - extend this for your custom block types\n */\nexport interface BaseBlock {\n id: string\n type: string\n parentId: string | null\n /** 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 /** Override the default long-press delay (200ms) for touch sensors */\n longPressDelay?: number\n /** Trigger haptic feedback (vibration) on drag start for touch devices */\n hapticFeedback?: boolean\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\nexport type SnapshotRectsRef = { current: Map<UniqueIdentifier, DOMRect> | null }\n\ninterface WeightedCollisionData {\n droppableContainer: Parameters<CollisionDetection>[0]['droppableContainers'][number]\n value: number\n left: number\n}\n\nfunction collisionValue(d: CollisionDescriptor): number {\n return (d.data as WeightedCollisionData).value\n}\n\nfunction collisionLeft(d: CollisionDescriptor): number {\n return (d.data as WeightedCollisionData).left\n}\n\n/**\n * Compute collision scores for drop zones\n * Considers both vertical distance and horizontal containment\n *\n * When snapshotRects is provided, uses snapshotted rects instead of live DOM\n * rects. This prevents feedback loops caused by in-flow ghost previews\n * shifting zone positions during drag.\n */\nfunction computeCollisionScores(\n droppableContainers: Parameters<CollisionDetection>[0]['droppableContainers'],\n collisionRect: NonNullable<Parameters<CollisionDetection>[0]['collisionRect']>,\n snapshotRects?: Map<UniqueIdentifier, DOMRect> | null\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 = snapshotRects?.get(container.id) ?? 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 whose indentation matches the pointer.\n // The factor (0.3) is tuned so a typical indentation gap (~48px) produces\n // a score difference (~14) that can overcome a reduced sticky threshold\n // for cross-depth transitions.\n const isWithinX = pointerX >= rect.left && pointerX <= rect.right\n\n let horizontalScore = 0\n if (isWithinX) {\n horizontalScore = Math.abs(pointerX - rect.left) * 0.3\n } else {\n const distanceToZone = pointerX < rect.left\n ? rect.left - pointerX\n : pointerX - rect.right\n horizontalScore = distanceToZone * 2\n }\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value: edgeDistance + bias + horizontalScore,\n left: rect.left,\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) => collisionValue(a) - collisionValue(b))\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 * @param snapshotRef - Optional ref to snapshotted zone rects. When populated,\n * collision detection uses these frozen rects instead of live DOM measurements,\n * preventing layout-shift feedback loops from in-flow ghost previews.\n */\nexport function createStickyCollision(\n threshold = 15,\n snapshotRef?: SnapshotRectsRef\n): 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, snapshotRef?.current)\n if (candidates.length === 0) return []\n\n const bestCandidate = candidates[0]\n const bestScore = collisionValue(bestCandidate)\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 = collisionValue(currentCandidate)\n\n // Use reduced threshold for cross-depth transitions (different indentation\n // levels). Same-depth zones get full stickiness to prevent flickering;\n // cross-depth zones are responsive so users can move in/out of containers.\n const currentLeft = collisionLeft(currentCandidate)\n const bestLeft = collisionLeft(bestCandidate)\n const crossDepth = Math.abs(currentLeft - bestLeft) > 20\n const effectiveThreshold = crossDepth ? threshold * 0.25 : threshold\n\n // Only switch if new winner is significantly better (by threshold)\n if (currentScore - bestScore < effectiveThreshold) {\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) => collisionValue(a) - collisionValue(b))\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: config.longPressDelay ?? 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\n/**\n * Trigger haptic feedback (vibration) on supported devices.\n * Safe to call in any environment — no-ops when `navigator.vibrate` is unavailable.\n */\nexport function triggerHaptic(durationMs = 10): void {\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') {\n navigator.vibrate(durationMs)\n }\n}\n","'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, memo, type ReactNode } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport type { BaseBlock, InternalRenderers, ContainerRendererProps, CanDragFn, AnimationConfig } 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 /** Animation configuration */\n animation?: AnimationConfig\n /** When virtual scrolling is active, only render blocks in this set */\n virtualVisibleIds?: Set<string> | null\n}\n\n/**\n * Ghost preview wrapper — renders in normal document flow so the user sees\n * an accurate preview of the final layout. Collision detection uses\n * snapshotted zone rects to avoid feedback loops from the ghost's displacement.\n */\nfunction GhostPreview({ children }: { children: ReactNode }) {\n return (\n <div data-dnd-ghost className=\"opacity-50\" style={{ pointerEvents: 'none' }}>\n {children}\n </div>\n )\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 isContainer,\n isExpanded,\n depth,\n posInSet,\n setSize,\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 isContainer?: boolean\n isExpanded?: boolean\n depth: number\n posInSet: number\n setSize: number\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 aria-level={depth + 1}\n aria-posinset={posInSet}\n aria-setsize={setSize}\n aria-expanded={isContainer ? isExpanded : undefined}\n aria-selected={isSelected ?? undefined}\n >\n {children({ isDragging })}\n </div>\n )\n}\n\n/**\n * Recursive tree renderer with smart drop zones\n */\nfunction TreeRendererInner<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 animation,\n virtualVisibleIds,\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 let filteredBlocks = items.filter(block => block.id !== activeId)\n\n // When virtual scrolling is active at root level, only render visible blocks\n if (virtualVisibleIds && depth === 0) {\n filteredBlocks = filteredBlocks.filter(block => virtualVisibleIds.has(block.id))\n }\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 — out-of-flow so it doesn't shift zones */}\n {ghostBeforeThis && GhostRenderer && (\n <GhostPreview>\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </GhostPreview>\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 isContainer={isContainer}\n isExpanded={isExpanded}\n depth={depth}\n posInSet={originalIndex + 1}\n setSize={items.length}\n >\n {({ isDragging }) => {\n if (isContainer) {\n const expandStyle = animation?.expandDuration\n ? {\n transition: `opacity ${animation.expandDuration}ms ${animation.easing ?? 'ease'}`,\n opacity: isExpanded ? 1 : 0,\n }\n : undefined\n\n const childContent = isExpanded ? (\n <div style={expandStyle}>\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 animation={animation}\n virtualVisibleIds={virtualVisibleIds}\n />\n </div>\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 — out-of-flow so it doesn't shift the end zone */}\n {showGhostHere && previewPosition!.index >= filteredBlocks.length && draggedBlock && (() => {\n const GhostRenderer = renderers[draggedBlock.type as keyof typeof renderers]\n return GhostRenderer ? (\n <GhostPreview>\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </GhostPreview>\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\nexport const TreeRenderer = memo(TreeRendererInner) as typeof TreeRendererInner\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 // Cannot move a block into its own descendants\n if (newParentId !== null && getDescendantIds(state, dragged.id).has(newParentId)) {\n return state\n }\n\n // Compute target insert index (before any mutation) for no-op detection\n const oldList = byParent.get(oldParentId) ?? []\n const currentIndexInOldParent = oldList.indexOf(dragged.id)\n\n // Compute what the target index would be in the new parent's child list\n const preNewList = byParent.get(newParentId) ?? []\n let targetIndex: number\n if (isInto) {\n targetIndex = 0\n } else if (isEnd) {\n targetIndex = preNewList.length\n } else {\n const idx = preNewList.indexOf(zoneTargetId)\n targetIndex = idx === -1 ? preNewList.length : isAfter ? idx + 1 : idx\n }\n\n // No-op detection: if same parent, adjust target for removal\n if (oldParentId === newParentId && currentIndexInOldParent !== -1) {\n const adjustedTarget = targetIndex > currentIndexInOldParent\n ? targetIndex - 1\n : targetIndex\n if (adjustedTarget === currentIndexInOldParent) {\n return state\n }\n }\n\n // Remove dragged from old parent\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 insertIndex = 0\n } else if (isEnd) {\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 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 const visited = new Set<string>()\n while (current !== null) {\n if (visited.has(current)) break\n visited.add(current)\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 visited = new Set<string>()\n): number {\n if (visited.has(blockId)) return 0\n visited.add(blockId)\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, visited))\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 * Result of validating a block tree\n */\nexport interface TreeValidationResult {\n valid: boolean\n issues: string[]\n}\n\n/**\n * Validate a block tree index for structural integrity.\n * Checks for cycles, orphans (parentId references non-existent block),\n * and stale refs (byParent lists IDs not present in byId).\n *\n * Opt-in utility — not called automatically.\n */\nexport function validateBlockTree<T extends BaseBlock>(\n index: BlockIndex<T>\n): TreeValidationResult {\n const issues: string[] = []\n\n // Check for cycles: walk parentId chain with visited set\n for (const [id] of index.byId) {\n const visited = new Set<string>()\n let current: string | null = id\n while (current !== null) {\n if (visited.has(current)) {\n issues.push(`Cycle detected: block \"${id}\" has a circular parentId chain`)\n break\n }\n visited.add(current)\n const block = index.byId.get(current)\n current = block?.parentId ?? null\n }\n }\n\n // Check for orphans: parentId points to non-existent ID\n for (const [id, block] of index.byId) {\n if (block.parentId !== null && !index.byId.has(block.parentId)) {\n issues.push(`Orphan: block \"${id}\" references non-existent parent \"${block.parentId}\"`)\n }\n }\n\n // Check for stale refs: byParent lists contain IDs not in byId\n for (const [parentId, childIds] of index.byParent) {\n for (const childId of childIds) {\n if (!index.byId.has(childId)) {\n issues.push(`Stale ref: byParent key \"${parentId}\" lists non-existent block \"${childId}\"`)\n }\n }\n }\n\n if (issues.length > 0) {\n for (const issue of issues) {\n console.warn(`[dnd-block-tree] ${issue}`)\n }\n }\n\n return { valid: issues.length === 0, issues }\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, useState, 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, type SnapshotRectsRef } 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, triggerHaptic } 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 /** Enable virtual scrolling for large trees (fixed item height only) */\n virtualize?: {\n /** Fixed height of each item in pixels */\n itemHeight: number\n /** Number of extra items to render outside the visible range (default: 5) */\n overscan?: number\n }\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 const expandedMap: Record<string, boolean> = {}\n const containers = blocks.filter(b => containerTypes.includes(b.type))\n for (const container of containers) {\n expandedMap[container.id] = false\n }\n return expandedMap\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 animation,\n initialExpanded,\n orderingStrategy = 'integer',\n maxDepth,\n keyboardNavigation = false,\n multiSelect = false,\n selectedIds: externalSelectedIds,\n onSelectionChange,\n virtualize,\n}: BlockTreeProps<T, C>) {\n const sensors = useConfiguredSensors({\n activationDistance: sensorConfig?.activationDistance ?? activationDistance,\n activationDelay: sensorConfig?.activationDelay,\n tolerance: sensorConfig?.tolerance,\n longPressDelay: sensorConfig?.longPressDelay,\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 // Snapshotted drop zone rects — collision detection reads from this instead\n // of live DOM to prevent feedback loops caused by in-flow ghost previews.\n const snapshotRectsRef = useRef<Map<string, DOMRect> | null>(null) as SnapshotRectsRef\n const needsResnapshot = useRef(false)\n\n // Sticky collision with hysteresis to prevent flickering between adjacent zones\n const stickyCollisionRef = useRef(createStickyCollision(20, snapshotRectsRef))\n\n // Snapshot all drop zone rects from the DOM\n const snapshotZoneRects = useCallback(() => {\n const root = rootRef.current\n if (!root) return\n const zones = root.querySelectorAll('[data-zone-id]')\n const map = new Map<string, DOMRect>()\n zones.forEach(el => {\n const id = el.getAttribute('data-zone-id')\n if (id) map.set(id, el.getBoundingClientRect())\n })\n snapshotRectsRef.current = map\n }, [])\n\n // Force re-render\n const [, forceRender] = useReducer((x: number) => x + 1, 0)\n\n // Debounced virtual state setter — also flags re-snapshot after ghost moves\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 needsResnapshot.current = true\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 = useMemo(\n () => computeNormalizedIndex(blocks, orderingStrategy),\n [blocks, orderingStrategy]\n )\n\n // Blocks by parent for rendering - always use original for stable zones\n const blocksByParent = useMemo(() => {\n const map = new Map<string | null, T[]>()\n for (const [parentId, ids] of originalIndex.byParent.entries()) {\n map.set(parentId, ids.map(id => originalIndex.byId.get(id)!).filter(Boolean))\n }\n return map\n }, [originalIndex])\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 // Re-snapshot zone rects after DOM settles (ghost moved to new position)\n useEffect(() => {\n if (!needsResnapshot.current || !stateRef.current.isDragging) return\n needsResnapshot.current = false\n // Wait for browser to paint the new ghost position before measuring\n requestAnimationFrame(() => {\n snapshotZoneRects()\n })\n })\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 // Trigger haptic feedback if configured\n if (sensorConfig?.hapticFeedback) {\n triggerHaptic()\n }\n\n stateRef.current.activeId = id\n stateRef.current.isDragging = true\n initialBlocksRef.current = [...blocks]\n cachedReorderRef.current = null\n needsResnapshot.current = true\n forceRender()\n }, [blocks, canDrag, onDragStart, multiSelect, selectedIds, setSelectedIds, visibleBlockIds, sensorConfig?.hapticFeedback])\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 snapshotRectsRef.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 snapshotRectsRef.current = null\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 snapshotRectsRef.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 // 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 // --- Virtual scrolling ---\n const virtualContainerRef = useRef<HTMLDivElement>(null)\n const [virtualScroll, setVirtualScroll] = useState({ scrollTop: 0, clientHeight: 0 })\n\n useEffect(() => {\n if (!virtualize) return\n const el = virtualContainerRef.current\n if (!el) return\n\n setVirtualScroll({ scrollTop: el.scrollTop, clientHeight: el.clientHeight })\n\n const onScroll = () => {\n setVirtualScroll({ scrollTop: el.scrollTop, clientHeight: el.clientHeight })\n }\n el.addEventListener('scroll', onScroll, { passive: true })\n return () => el.removeEventListener('scroll', onScroll)\n }, [virtualize])\n\n const virtualResult = useMemo(() => {\n if (!virtualize) return null\n\n const { itemHeight, overscan = 5 } = virtualize\n const { scrollTop, clientHeight } = virtualScroll\n const totalHeight = visibleBlockIds.length * itemHeight\n const startRaw = Math.floor(scrollTop / itemHeight)\n const visibleCount = Math.ceil(clientHeight / itemHeight)\n const start = Math.max(0, startRaw - overscan)\n const end = Math.min(visibleBlockIds.length - 1, startRaw + visibleCount + overscan)\n const offsetY = start * itemHeight\n\n const visibleSet = new Set<string>()\n for (let i = start; i <= end; i++) {\n visibleSet.add(visibleBlockIds[i])\n }\n\n return { totalHeight, offsetY, visibleSet }\n }, [virtualize, virtualScroll, visibleBlockIds])\n\n const treeContent = (\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 animation={animation}\n virtualVisibleIds={virtualResult?.visibleSet ?? null}\n />\n )\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 {virtualize ? (\n <div\n ref={(el) => {\n (virtualContainerRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n (rootRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n }}\n className={className}\n style={{ minWidth: 0, overflow: 'auto', position: 'relative' }}\n onKeyDown={keyboardNavigation ? handleKeyDown : undefined}\n role={keyboardNavigation ? 'tree' : undefined}\n >\n <div style={{ height: virtualResult!.totalHeight, position: 'relative' }}>\n <div style={{ position: 'absolute', top: virtualResult!.offsetY, left: 0, right: 0 }}>\n {treeContent}\n </div>\n </div>\n </div>\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 {treeContent}\n </div>\n )}\n <DragOverlay activeBlock={activeBlock} selectedCount={multiSelect ? selectedIds.size : 0}>\n {dragOverlay}\n </DragOverlay>\n </DndContext>\n )\n}\n","'use client'\n\nimport { useState, useEffect, type ReactNode } from 'react'\nimport { BlockTree, type BlockTreeProps } from './BlockTree'\nimport type { BaseBlock } from '../core/types'\n\nexport interface BlockTreeSSRProps<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n> extends BlockTreeProps<T, C> {\n /** Content to render before hydration completes (default: null) */\n fallback?: ReactNode\n}\n\n/**\n * Hydration-safe wrapper for BlockTree in SSR environments.\n * Renders the fallback (or nothing) on the server and during initial hydration,\n * then mounts the full BlockTree after the client has hydrated.\n */\nexport function BlockTreeSSR<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n>({ fallback = null, ...props }: BlockTreeSSRProps<T, C>) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return <>{fallback}</>\n }\n\n return <BlockTree<T, C> {...props} />\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","'use client'\n\nimport { useRef, useLayoutEffect } from 'react'\n\nexport interface UseLayoutAnimationOptions {\n /** Duration of the transition in ms (default: 200) */\n duration?: number\n /** CSS easing function (default: 'ease') */\n easing?: string\n /** CSS selector for animated children (default: '[data-block-id]') */\n selector?: string\n}\n\n/**\n * FLIP-based layout animation hook for reorder transitions.\n *\n * Captures block positions before render (layout effect cleanup),\n * computes the delta after render, and applies a CSS transform transition.\n *\n * Usage:\n * ```tsx\n * const containerRef = useRef<HTMLDivElement>(null)\n * useLayoutAnimation(containerRef, { duration: 200 })\n * return <div ref={containerRef}>...</div>\n * ```\n */\nexport function useLayoutAnimation(\n containerRef: React.RefObject<HTMLElement | null>,\n options: UseLayoutAnimationOptions = {}\n) {\n const {\n duration = 200,\n easing = 'ease',\n selector = '[data-block-id]',\n } = options\n\n // Store previous positions keyed by data-block-id\n const prevPositions = useRef(new Map<string, DOMRect>())\n\n useLayoutEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const children = container.querySelectorAll(selector)\n const currentPositions = new Map<string, DOMRect>()\n\n // Capture current (post-render) positions\n children.forEach(el => {\n const id = (el as HTMLElement).dataset.blockId\n if (id) {\n currentPositions.set(id, el.getBoundingClientRect())\n }\n })\n\n // Apply FLIP animation for elements that moved\n children.forEach(el => {\n const htmlEl = el as HTMLElement\n const id = htmlEl.dataset.blockId\n if (!id) return\n\n const prev = prevPositions.current.get(id)\n const curr = currentPositions.get(id)\n if (!prev || !curr) return\n\n const deltaY = prev.top - curr.top\n const deltaX = prev.left - curr.left\n\n if (deltaY === 0 && deltaX === 0) return\n\n // First: apply inverse transform (move to old position)\n htmlEl.style.transform = `translate(${deltaX}px, ${deltaY}px)`\n htmlEl.style.transition = 'none'\n\n // Play: animate to new position\n requestAnimationFrame(() => {\n htmlEl.style.transition = `transform ${duration}ms ${easing}`\n htmlEl.style.transform = ''\n\n const onEnd = () => {\n htmlEl.style.transition = ''\n htmlEl.removeEventListener('transitionend', onEnd)\n }\n htmlEl.addEventListener('transitionend', onEnd)\n })\n })\n\n // Store current positions for next render\n prevPositions.current = currentPositions\n })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\n\nexport interface UseVirtualTreeOptions {\n /** Ref to the scrollable container element */\n containerRef: React.RefObject<HTMLElement | null>\n /** Total number of items in the tree */\n itemCount: number\n /** Fixed height of each item in pixels */\n itemHeight: number\n /** Number of extra items to render outside the visible range (default: 5) */\n overscan?: number\n}\n\nexport interface UseVirtualTreeResult {\n /** Start and end indices of the visible range (inclusive) */\n visibleRange: { start: number; end: number }\n /** Total height of all items for the spacer div */\n totalHeight: number\n /** Offset from top for the first rendered item */\n offsetY: number\n}\n\n/**\n * Lightweight fixed-height virtual scrolling hook for tree lists.\n *\n * Tracks scroll position on the container and computes which items\n * should be rendered based on the viewport and overscan.\n */\nexport function useVirtualTree({\n containerRef,\n itemCount,\n itemHeight,\n overscan = 5,\n}: UseVirtualTreeOptions): UseVirtualTreeResult {\n const [scrollTop, setScrollTop] = useState(0)\n const [containerHeight, setContainerHeight] = useState(0)\n const rafId = useRef(0)\n\n const handleScroll = useCallback(() => {\n cancelAnimationFrame(rafId.current)\n rafId.current = requestAnimationFrame(() => {\n const el = containerRef.current\n if (el) {\n setScrollTop(el.scrollTop)\n setContainerHeight(el.clientHeight)\n }\n })\n }, [containerRef])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n\n // Initialize\n setScrollTop(el.scrollTop)\n setContainerHeight(el.clientHeight)\n\n el.addEventListener('scroll', handleScroll, { passive: true })\n return () => {\n el.removeEventListener('scroll', handleScroll)\n cancelAnimationFrame(rafId.current)\n }\n }, [containerRef, handleScroll])\n\n const totalHeight = itemCount * itemHeight\n\n // Compute visible range\n const startRaw = Math.floor(scrollTop / itemHeight)\n const visibleCount = Math.ceil(containerHeight / itemHeight)\n const start = Math.max(0, startRaw - overscan)\n const end = Math.min(itemCount - 1, startRaw + visibleCount + overscan)\n\n const offsetY = start * itemHeight\n\n return {\n visibleRange: { start, end },\n totalHeight,\n offsetY,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useMemo, useEffect } from 'react'\nimport type { BaseBlock, BlockTreeCallbacks, DragStartEvent, DragEndEvent, BlockMoveEvent, ExpandChangeEvent, HoverChangeEvent } from '../core/types'\nimport { computeNormalizedIndex, validateBlockTree, getBlockDepth } from '../utils/blocks'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DevToolsEventEntry {\n id: number\n timestamp: number\n type: 'dragStart' | 'dragEnd' | 'blockMove' | 'expandChange' | 'hoverChange'\n summary: string\n}\n\nexport interface DevToolsCallbacks<T extends BaseBlock = BaseBlock> {\n onDragStart: NonNullable<BlockTreeCallbacks<T>['onDragStart']>\n onDragEnd: NonNullable<BlockTreeCallbacks<T>['onDragEnd']>\n onBlockMove: NonNullable<BlockTreeCallbacks<T>['onBlockMove']>\n onExpandChange: NonNullable<BlockTreeCallbacks<T>['onExpandChange']>\n onHoverChange: NonNullable<BlockTreeCallbacks<T>['onHoverChange']>\n}\n\nexport interface BlockTreeDevToolsProps<T extends BaseBlock = BaseBlock> {\n blocks: T[]\n containerTypes?: readonly string[]\n events: DevToolsEventEntry[]\n onClearEvents: () => void\n /** Label function for diff view (default: block.type) */\n getLabel?: (block: T) => string\n /** Initial open state (default: false) */\n initialOpen?: boolean\n /** Position of the trigger button (default: 'bottom-left') */\n position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'\n /** Custom inline styles for the trigger button */\n buttonStyle?: React.CSSProperties\n /** Custom inline styles for the card panel */\n panelStyle?: React.CSSProperties\n}\n\n// ============================================================================\n// Hook: useDevToolsCallbacks\n// ============================================================================\n\nconst MAX_EVENTS = 100\n\nexport function useDevToolsCallbacks<T extends BaseBlock = BaseBlock>() {\n const [events, setEvents] = useState<DevToolsEventEntry[]>([])\n const nextIdRef = useRef(1)\n\n const addEvent = useCallback((type: DevToolsEventEntry['type'], summary: string) => {\n const entry: DevToolsEventEntry = {\n id: nextIdRef.current++,\n timestamp: Date.now(),\n type,\n summary,\n }\n setEvents(prev => [entry, ...prev].slice(0, MAX_EVENTS))\n }, [])\n\n const clearEvents = useCallback(() => {\n setEvents([])\n }, [])\n\n const callbacks: DevToolsCallbacks<T> = useMemo(() => ({\n onDragStart: (event: DragStartEvent<T>) => {\n addEvent('dragStart', `Started dragging \"${event.blockId}\"`)\n },\n onDragEnd: (event: DragEndEvent<T>) => {\n if (event.cancelled) {\n addEvent('dragEnd', `Cancelled drag of \"${event.blockId}\"`)\n } else {\n addEvent('dragEnd', `Dropped \"${event.blockId}\" at ${event.targetZone ?? 'none'}`)\n }\n },\n onBlockMove: (event: BlockMoveEvent<T>) => {\n const fromStr = `parent=${event.from.parentId ?? 'root'}[${event.from.index}]`\n const toStr = `parent=${event.to.parentId ?? 'root'}[${event.to.index}]`\n const ids = event.movedIds.length > 1 ? ` (${event.movedIds.length} blocks)` : ''\n addEvent('blockMove', `Moved \"${event.block.id}\" from ${fromStr} to ${toStr}${ids}`)\n },\n onExpandChange: (event: ExpandChangeEvent<T>) => {\n addEvent('expandChange', `${event.expanded ? 'Expanded' : 'Collapsed'} \"${event.blockId}\"`)\n },\n onHoverChange: (event: HoverChangeEvent<T>) => {\n if (event.zoneId) {\n addEvent('hoverChange', `Hovering over zone \"${event.zoneId}\"`)\n }\n },\n }), [addEvent])\n\n return { callbacks, events, clearEvents }\n}\n\n// ============================================================================\n// Logo SVG\n// ============================================================================\n\nfunction DevToolsLogo({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"5\" rx=\"1\" fill=\"#3b82f6\" opacity=\"0.9\" />\n <rect x=\"8\" y=\"10\" width=\"8\" height=\"5\" rx=\"1\" fill=\"#10b981\" opacity=\"0.9\" />\n <rect x=\"14\" y=\"18\" width=\"8\" height=\"5\" rx=\"1\" fill=\"#f59e0b\" opacity=\"0.9\" />\n <path d=\"M6 7 L6 10 L8 10\" stroke=\"#888\" strokeWidth=\"1.5\" fill=\"none\" opacity=\"0.6\" />\n <path d=\"M12 15 L12 18 L14 18\" stroke=\"#888\" strokeWidth=\"1.5\" fill=\"none\" opacity=\"0.6\" />\n </svg>\n )\n}\n\n// ============================================================================\n// Diff computation (inline, no external deps)\n// ============================================================================\n\ntype ChangeType = 'added' | 'moved' | 'unchanged'\n\ninterface DiffEntry<T extends BaseBlock> {\n block: T\n changeType: ChangeType\n depth: number\n}\n\nfunction computeDiffMap<T extends BaseBlock>(prev: T[], next: T[]): Map<string, ChangeType> {\n const prevMap = new Map(prev.map(b => [b.id, b]))\n const changeMap = new Map<string, ChangeType>()\n for (const block of next) {\n const prevBlock = prevMap.get(block.id)\n if (!prevBlock) {\n changeMap.set(block.id, 'added')\n } else if (prevBlock.parentId !== block.parentId || prevBlock.order !== block.order) {\n changeMap.set(block.id, 'moved')\n } else {\n changeMap.set(block.id, 'unchanged')\n }\n }\n return changeMap\n}\n\nfunction buildDiffTree<T extends BaseBlock>(blocks: T[], changeMap: Map<string, ChangeType>): DiffEntry<T>[] {\n const result: DiffEntry<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 function walk(parentId: string | null, depth: number) {\n const children = byParent.get(parentId) ?? []\n children.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 for (const block of children) {\n result.push({ block, changeType: changeMap.get(block.id) ?? 'unchanged', depth })\n walk(block.id, depth + 1)\n }\n }\n walk(null, 0)\n return result\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst TYPE_COLORS: Record<DevToolsEventEntry['type'], string> = {\n dragStart: '#3b82f6',\n dragEnd: '#10b981',\n blockMove: '#f59e0b',\n expandChange: '#8b5cf6',\n hoverChange: '#6b7280',\n}\n\nconst TYPE_LABELS: Record<DevToolsEventEntry['type'], string> = {\n dragStart: 'DRAG',\n dragEnd: 'DROP',\n blockMove: 'MOVE',\n expandChange: 'EXPAND',\n hoverChange: 'HOVER',\n}\n\nconst TYPE_TOOLTIPS: Record<DevToolsEventEntry['type'], string> = {\n dragStart: 'onDragStart — a block was picked up',\n dragEnd: 'onDragEnd — a block was dropped or drag was cancelled',\n blockMove: 'onBlockMove — a block was reparented to a new position',\n expandChange: 'onExpandChange — a container was expanded or collapsed',\n hoverChange: 'onHoverChange — the pointer entered a drop zone',\n}\n\nconst DEFAULT_WIDTH = 340\nconst DEFAULT_HEIGHT = 420\nconst DIFF_EXTRA_WIDTH = 300\nconst MIN_WIDTH = 280\nconst MIN_HEIGHT = 200\n\ntype AnchorCSS = { bottom?: number; top?: number; left?: number; right?: number }\n\nfunction getAnchorCSS(position: BlockTreeDevToolsProps['position']): AnchorCSS {\n switch (position) {\n case 'bottom-right': return { bottom: 16, right: 16 }\n case 'top-left': return { top: 16, left: 16 }\n case 'top-right': return { top: 16, right: 16 }\n case 'bottom-left':\n default: return { bottom: 16, left: 16 }\n }\n}\n\nfunction computeCardOrigin(position: BlockTreeDevToolsProps['position'], width: number, height: number): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1024\n const vh = typeof window !== 'undefined' ? window.innerHeight : 768\n switch (position) {\n case 'bottom-right':\n return { x: Math.max(0, vw - 16 - width), y: Math.max(0, vh - 16 - height - 48) }\n case 'top-left':\n return { x: 16, y: 16 + 48 }\n case 'top-right':\n return { x: Math.max(0, vw - 16 - width), y: 16 + 48 }\n case 'bottom-left':\n default:\n return { x: 16, y: Math.max(0, vh - 16 - height - 48) }\n }\n}\n\n// ============================================================================\n// Component: BlockTreeDevTools\n// ============================================================================\n\nexport function BlockTreeDevTools<T extends BaseBlock = BaseBlock>({\n blocks,\n containerTypes = [],\n events,\n onClearEvents,\n getLabel = (b) => b.type,\n initialOpen = false,\n position = 'bottom-left',\n buttonStyle,\n panelStyle,\n}: BlockTreeDevToolsProps<T>) {\n const [isOpen, setIsOpen] = useState(initialOpen)\n const [showDiff, setShowDiff] = useState(false)\n const [cardPos, setCardPos] = useState<{ x: number; y: number } | null>(null)\n const [cardSize, setCardSize] = useState<{ w: number; h: number }>({ w: DEFAULT_WIDTH, h: DEFAULT_HEIGHT })\n const [showTooltip, setShowTooltip] = useState(false)\n\n // Drag state (title bar)\n const dragRef = useRef<{ dragging: boolean; startX: number; startY: number; origX: number; origY: number }>({\n dragging: false, startX: 0, startY: 0, origX: 0, origY: 0,\n })\n\n // Resize state\n const resizeRef = useRef<{\n active: boolean\n edge: string\n startX: number; startY: number\n origX: number; origY: number\n origW: number; origH: number\n }>({ active: false, edge: '', startX: 0, startY: 0, origX: 0, origY: 0, origW: 0, origH: 0 })\n\n const cardRef = useRef<HTMLDivElement>(null)\n\n // Diff state tracking\n const prevBlocksRef = useRef<T[]>(blocks)\n const diffChangeMap = useMemo(() => computeDiffMap(prevBlocksRef.current, blocks), [blocks])\n useEffect(() => { prevBlocksRef.current = blocks }, [blocks])\n const diffTree = useMemo(() => buildDiffTree(blocks, diffChangeMap), [blocks, diffChangeMap])\n const diffStats = useMemo(() => {\n let added = 0, moved = 0\n for (const { changeType } of diffTree) {\n if (changeType === 'added') added++\n if (changeType === 'moved') moved++\n }\n return { added, moved }\n }, [diffTree])\n\n // Auto-widen/shrink when toggling diff\n useEffect(() => {\n setCardSize(prev => {\n const targetW = showDiff ? DEFAULT_WIDTH + DIFF_EXTRA_WIDTH : DEFAULT_WIDTH\n // Only auto-resize if at the \"natural\" widths (user hasn't manually resized to something custom)\n const wasDefault = Math.abs(prev.w - DEFAULT_WIDTH) < 20\n const wasExpanded = Math.abs(prev.w - (DEFAULT_WIDTH + DIFF_EXTRA_WIDTH)) < 20\n if (showDiff && (wasDefault || prev.w < targetW)) {\n return { ...prev, w: targetW }\n }\n if (!showDiff && wasExpanded) {\n return { ...prev, w: DEFAULT_WIDTH }\n }\n return prev\n })\n }, [showDiff])\n\n // Compute initial card position\n const getDefaultCardPos = useCallback(() => {\n return computeCardOrigin(position, cardSize.w, cardSize.h)\n }, [position, cardSize.w, cardSize.h])\n\n // Set card position when opening\n useEffect(() => {\n if (isOpen && !cardPos) {\n setCardPos(getDefaultCardPos())\n }\n }, [isOpen, cardPos, getDefaultCardPos])\n\n // ---------- Drag (title bar) ----------\n\n const handleDragPointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault()\n dragRef.current = {\n dragging: true,\n startX: e.clientX,\n startY: e.clientY,\n origX: cardPos?.x ?? 0,\n origY: cardPos?.y ?? 0,\n }\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [cardPos])\n\n const handleDragPointerMove = useCallback((e: React.PointerEvent) => {\n if (!dragRef.current.dragging) return\n const dx = e.clientX - dragRef.current.startX\n const dy = e.clientY - dragRef.current.startY\n const newX = dragRef.current.origX + dx\n const newY = dragRef.current.origY + dy\n const maxX = window.innerWidth - cardSize.w\n const maxY = window.innerHeight - 40\n setCardPos({\n x: Math.max(0, Math.min(newX, maxX)),\n y: Math.max(0, Math.min(newY, maxY)),\n })\n }, [cardSize.w])\n\n const handleDragPointerUp = useCallback(() => {\n dragRef.current.dragging = false\n }, [])\n\n // ---------- Resize ----------\n\n const handleResizePointerDown = useCallback((edge: string) => (e: React.PointerEvent) => {\n e.preventDefault()\n e.stopPropagation()\n resizeRef.current = {\n active: true,\n edge,\n startX: e.clientX,\n startY: e.clientY,\n origX: cardPos?.x ?? 0,\n origY: cardPos?.y ?? 0,\n origW: cardSize.w,\n origH: cardSize.h,\n }\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [cardPos, cardSize])\n\n const handleResizePointerMove = useCallback((e: React.PointerEvent) => {\n const r = resizeRef.current\n if (!r.active) return\n const dx = e.clientX - r.startX\n const dy = e.clientY - r.startY\n let newW = r.origW\n let newH = r.origH\n let newX = r.origX\n let newY = r.origY\n\n if (r.edge.includes('e')) newW = Math.max(MIN_WIDTH, r.origW + dx)\n if (r.edge.includes('w')) {\n newW = Math.max(MIN_WIDTH, r.origW - dx)\n newX = r.origX + (r.origW - newW)\n }\n if (r.edge.includes('s')) newH = Math.max(MIN_HEIGHT, r.origH + dy)\n if (r.edge.includes('n')) {\n newH = Math.max(MIN_HEIGHT, r.origH - dy)\n newY = r.origY + (r.origH - newH)\n }\n\n setCardSize({ w: newW, h: newH })\n setCardPos({ x: newX, y: newY })\n }, [])\n\n const handleResizePointerUp = useCallback(() => {\n resizeRef.current.active = false\n }, [])\n\n const toggle = useCallback(() => {\n setIsOpen(prev => !prev)\n }, [])\n\n const toggleDiff = useCallback(() => {\n setShowDiff(prev => !prev)\n }, [])\n\n // ---------- Stats ----------\n\n const renderCountRef = useRef(0)\n const lastRenderTimeRef = useRef(performance.now())\n const prevBlockCountRef = useRef(blocks.length)\n\n renderCountRef.current++\n const renderTime = performance.now() - lastRenderTimeRef.current\n lastRenderTimeRef.current = performance.now()\n\n const blockCountDelta = blocks.length - prevBlockCountRef.current\n useEffect(() => {\n prevBlockCountRef.current = blocks.length\n }, [blocks.length])\n\n const treeStats = useMemo(() => {\n const index = computeNormalizedIndex(blocks as BaseBlock[])\n const containers = blocks.filter(b => containerTypes.includes(b.type))\n let maxDepthVal = 0\n for (const block of blocks) {\n const d = getBlockDepth(index, block.id)\n if (d > maxDepthVal) maxDepthVal = d\n }\n const validation = validateBlockTree(index)\n return {\n blockCount: blocks.length,\n containerCount: containers.length,\n maxDepth: maxDepthVal,\n validation,\n }\n }, [blocks, containerTypes])\n\n const formatTime = (ts: number) => {\n const d = new Date(ts)\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}`\n }\n\n // ---------- Styles ----------\n\n const anchor = getAnchorCSS(position)\n\n const triggerBtnStyle: React.CSSProperties = {\n position: 'fixed',\n ...anchor,\n zIndex: 99998,\n width: 40,\n height: 40,\n borderRadius: '50%',\n border: 'none',\n background: isOpen ? 'rgba(59, 130, 246, 0.9)' : 'rgba(30, 30, 30, 0.85)',\n color: '#fff',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n transition: 'background 0.15s, transform 0.15s',\n ...buttonStyle,\n }\n\n const tooltipStyle: React.CSSProperties = {\n position: 'absolute',\n whiteSpace: 'nowrap',\n fontSize: 11,\n fontWeight: 500,\n padding: '4px 10px',\n borderRadius: 6,\n background: 'rgba(15, 15, 20, 0.95)',\n color: '#ccc',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n pointerEvents: 'none',\n // Position based on anchor corner\n ...(anchor.bottom !== undefined\n ? { bottom: '100%', marginBottom: 8 }\n : { top: '100%', marginTop: 8 }),\n ...(anchor.left !== undefined\n ? { left: 0 }\n : { right: 0 }),\n }\n\n const cardStyle: React.CSSProperties = {\n position: 'fixed',\n left: cardPos?.x ?? 0,\n top: cardPos?.y ?? 0,\n zIndex: 99999,\n width: cardSize.w,\n height: cardSize.h,\n background: 'rgba(20, 20, 24, 0.95)',\n backdropFilter: 'blur(12px)',\n border: '1px solid rgba(255,255,255,0.1)',\n borderRadius: 10,\n color: '#e0e0e0',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 12,\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 8px 32px rgba(0,0,0,0.5)',\n overflow: 'hidden',\n ...panelStyle,\n }\n\n const titleBarStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n gap: 8,\n background: 'rgba(255,255,255,0.04)',\n borderBottom: '1px solid rgba(255,255,255,0.08)',\n cursor: 'grab',\n userSelect: 'none',\n flexShrink: 0,\n touchAction: 'none',\n }\n\n const titleTextStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.03em',\n opacity: 0.8,\n flexShrink: 0,\n }\n\n const titleBtnStyle = (active?: boolean): React.CSSProperties => ({\n height: 22,\n padding: '0 8px',\n borderRadius: 4,\n border: '1px solid ' + (active ? 'rgba(59,130,246,0.5)' : 'rgba(128,128,128,0.25)'),\n background: active ? 'rgba(59,130,246,0.15)' : 'transparent',\n color: active ? '#93b8f7' : '#999',\n cursor: 'pointer',\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: '0.02em',\n flexShrink: 0,\n })\n\n const closeBtnStyle: React.CSSProperties = {\n width: 20,\n height: 20,\n borderRadius: 4,\n border: 'none',\n background: 'transparent',\n color: '#999',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 14,\n lineHeight: '1',\n padding: 0,\n flexShrink: 0,\n }\n\n const bodyStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'row',\n overflow: 'hidden',\n minHeight: 0,\n }\n\n const mainColumnStyle: React.CSSProperties = {\n flex: showDiff ? '0 0 50%' : '1 1 100%',\n overflow: 'auto',\n padding: '10px 12px',\n minWidth: 0,\n }\n\n const diffColumnStyle: React.CSSProperties = {\n flex: '0 0 50%',\n overflow: 'auto',\n padding: '10px 12px',\n borderLeft: '1px solid rgba(255,255,255,0.08)',\n minWidth: 0,\n }\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: 8,\n }\n\n const headingStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n opacity: 0.6,\n marginBottom: 6,\n }\n\n const statRowStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n fontSize: 12,\n padding: '2px 0',\n }\n\n const statValueStyle: React.CSSProperties = {\n fontFamily: 'monospace',\n fontSize: 11,\n opacity: 0.8,\n }\n\n const badgeStyle = (color: string): React.CSSProperties => ({\n display: 'inline-block',\n fontSize: 9,\n fontWeight: 700,\n fontFamily: 'monospace',\n padding: '1px 5px',\n borderRadius: 3,\n backgroundColor: color + '22',\n color,\n marginRight: 6,\n flexShrink: 0,\n })\n\n const eventListStyle: React.CSSProperties = {\n maxHeight: 160,\n overflowY: 'auto',\n fontSize: 11,\n lineHeight: '1.6',\n }\n\n const eventItemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 4,\n padding: '2px 0',\n borderBottom: '1px solid rgba(128,128,128,0.1)',\n }\n\n const timeStyle: React.CSSProperties = {\n fontFamily: 'monospace',\n fontSize: 10,\n opacity: 0.4,\n flexShrink: 0,\n minWidth: 52,\n }\n\n const clearBtnStyle: React.CSSProperties = {\n fontSize: 10,\n padding: '2px 8px',\n border: '1px solid rgba(128,128,128,0.3)',\n borderRadius: 4,\n background: 'transparent',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n }\n\n // Resize edge styles\n const EDGE_SIZE = 6\n const resizeEdge = (edge: string): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: 'absolute',\n zIndex: 1,\n }\n const cursors: Record<string, string> = {\n n: 'ns-resize', s: 'ns-resize', e: 'ew-resize', w: 'ew-resize',\n ne: 'nesw-resize', nw: 'nwse-resize', se: 'nwse-resize', sw: 'nesw-resize',\n }\n const styles: Record<string, React.CSSProperties> = {\n n: { top: 0, left: EDGE_SIZE, right: EDGE_SIZE, height: EDGE_SIZE },\n s: { bottom: 0, left: EDGE_SIZE, right: EDGE_SIZE, height: EDGE_SIZE },\n e: { right: 0, top: EDGE_SIZE, bottom: EDGE_SIZE, width: EDGE_SIZE },\n w: { left: 0, top: EDGE_SIZE, bottom: EDGE_SIZE, width: EDGE_SIZE },\n ne: { top: 0, right: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n nw: { top: 0, left: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n se: { bottom: 0, right: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n sw: { bottom: 0, left: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n }\n return { ...base, cursor: cursors[edge], ...styles[edge] }\n }\n\n const EDGES = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw']\n\n // Diff row colors\n const diffRowColor = (ct: ChangeType): React.CSSProperties => {\n if (ct === 'added') return { background: 'rgba(16,185,129,0.1)', color: '#34d399' }\n if (ct === 'moved') return { background: 'rgba(245,158,11,0.1)', color: '#fbbf24' }\n return { color: 'rgba(200,200,200,0.5)' }\n }\n\n return (\n <>\n {/* Trigger Button + Tooltip */}\n <div style={{ position: 'fixed', ...anchor, zIndex: 99998 }}>\n <button\n onClick={toggle}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n style={triggerBtnStyle}\n aria-label={isOpen ? 'Close DevTools' : 'Open DevTools'}\n >\n <DevToolsLogo size={20} />\n </button>\n {showTooltip && !isOpen && (\n <div style={tooltipStyle}>dnd-block-tree DevTools</div>\n )}\n </div>\n\n {/* Floating Card */}\n {isOpen && cardPos && (\n <div\n ref={cardRef}\n style={cardStyle}\n data-devtools-root=\"\"\n >\n {/* Resize handles */}\n {EDGES.map(edge => (\n <div\n key={edge}\n style={resizeEdge(edge)}\n onPointerDown={handleResizePointerDown(edge)}\n onPointerMove={handleResizePointerMove}\n onPointerUp={handleResizePointerUp}\n />\n ))}\n\n {/* Title Bar (drag handle) */}\n <div\n style={titleBarStyle}\n onPointerDown={handleDragPointerDown}\n onPointerMove={handleDragPointerMove}\n onPointerUp={handleDragPointerUp}\n >\n <span style={titleTextStyle}>DevTools</span>\n <div style={{ flex: 1 }} />\n <button\n onClick={toggleDiff}\n style={titleBtnStyle(showDiff)}\n onPointerDown={e => e.stopPropagation()}\n title=\"Toggle structure diff — shows which blocks were added, moved, or unchanged\"\n >\n Diff\n </button>\n <button\n onClick={toggle}\n style={closeBtnStyle}\n onPointerDown={e => e.stopPropagation()}\n aria-label=\"Close DevTools\"\n >\n ×\n </button>\n </div>\n\n {/* Body */}\n <div style={bodyStyle}>\n {/* Main column */}\n <div style={mainColumnStyle}>\n {/* Tree State */}\n <div style={sectionStyle} data-devtools-section=\"tree-state\">\n <div style={headingStyle} title=\"Live snapshot of the block tree structure\">Tree State</div>\n <div style={statRowStyle} title=\"Total number of blocks in the flat array\">\n <span>Blocks</span>\n <span style={statValueStyle}>{treeStats.blockCount}</span>\n </div>\n <div style={statRowStyle} title=\"Blocks whose type is in containerTypes (can have children)\">\n <span>Containers</span>\n <span style={statValueStyle}>{treeStats.containerCount}</span>\n </div>\n <div style={statRowStyle} title=\"Deepest nesting level in the tree (root = 1)\">\n <span>Max Depth</span>\n <span style={statValueStyle}>{treeStats.maxDepth}</span>\n </div>\n <div style={statRowStyle} title=\"Checks for cycles, orphans, and stale parent refs\">\n <span>Validation</span>\n <span style={{\n ...statValueStyle,\n color: treeStats.validation.valid ? '#10b981' : '#ef4444',\n }}>\n {treeStats.validation.valid ? 'Valid' : `${treeStats.validation.issues.length} issue(s)`}\n </span>\n </div>\n {!treeStats.validation.valid && (\n <div style={{ fontSize: 10, color: '#ef4444', marginTop: 4 }}>\n {treeStats.validation.issues.map((issue, i) => (\n <div key={i}>{issue}</div>\n ))}\n </div>\n )}\n </div>\n\n {/* Event Log */}\n <div style={sectionStyle} data-devtools-section=\"event-log\">\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6 }}>\n <div style={headingStyle} title=\"Chronological log of drag, drop, move, expand, and hover events\">Event Log ({events.length})</div>\n {events.length > 0 && (\n <button onClick={onClearEvents} style={clearBtnStyle}>Clear</button>\n )}\n </div>\n <div style={eventListStyle}>\n {events.length === 0 ? (\n <div style={{ fontSize: 11, opacity: 0.4, padding: '8px 0' }}>\n No events yet. Drag some blocks!\n </div>\n ) : (\n events.map(event => (\n <div key={event.id} style={eventItemStyle}>\n <span style={timeStyle}>{formatTime(event.timestamp)}</span>\n <span style={badgeStyle(TYPE_COLORS[event.type])} title={TYPE_TOOLTIPS[event.type]}>{TYPE_LABELS[event.type]}</span>\n <span style={{ wordBreak: 'break-word' }}>{event.summary}</span>\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* Performance */}\n <div style={sectionStyle} data-devtools-section=\"performance\">\n <div style={headingStyle} title=\"Render metrics for the DevTools component itself\">Performance</div>\n <div style={statRowStyle} title=\"How many times this DevTools component has rendered\">\n <span>Render Count</span>\n <span style={statValueStyle}>{renderCountRef.current}</span>\n </div>\n <div style={statRowStyle} title=\"Time since the previous render of this component\">\n <span>Last Render</span>\n <span style={statValueStyle}>{renderTime.toFixed(1)}ms</span>\n </div>\n <div style={statRowStyle} title=\"Change in block count since the last render (+added / -removed)\">\n <span style={{\n ...statValueStyle,\n color: blockCountDelta > 0 ? '#10b981' : blockCountDelta < 0 ? '#ef4444' : undefined,\n }}>\n {blockCountDelta > 0 ? '+' : ''}{blockCountDelta}\n </span>\n </div>\n </div>\n </div>\n\n {/* Diff column */}\n {showDiff && (\n <div style={diffColumnStyle}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n <div style={headingStyle} title=\"Tree structure diff — compares current state to the previous render\">Structure</div>\n <div style={{ display: 'flex', gap: 10, fontSize: 11, fontWeight: 500 }}>\n {diffStats.added > 0 && (\n <span style={{ color: '#34d399', display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ width: 5, height: 5, borderRadius: '50%', background: '#34d399', display: 'inline-block' }} />\n {diffStats.added} new\n </span>\n )}\n {diffStats.moved > 0 && (\n <span style={{ color: '#fbbf24', display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ width: 5, height: 5, borderRadius: '50%', background: '#fbbf24', display: 'inline-block' }} />\n {diffStats.moved} moved\n </span>\n )}\n {diffStats.added === 0 && diffStats.moved === 0 && (\n <span style={{ opacity: 0.4 }}>No changes</span>\n )}\n </div>\n </div>\n <div style={{ fontFamily: 'monospace', fontSize: 11, lineHeight: '1.7' }}>\n {diffTree.map(({ block, changeType, depth }) => (\n <div\n key={block.id}\n style={{\n paddingLeft: depth * 14,\n padding: '2px 6px 2px ' + (depth * 14 + 6) + 'px',\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n ...diffRowColor(changeType),\n }}\n >\n <span style={{ width: 12, textAlign: 'center', fontWeight: 700, fontSize: 10 }}>\n {changeType === 'added' && '+'}\n {changeType === 'moved' && '~'}\n </span>\n <span style={{\n textTransform: 'uppercase',\n fontSize: 9,\n letterSpacing: '0.05em',\n width: 50,\n flexShrink: 0,\n opacity: changeType === 'unchanged' ? 0.5 : 1,\n }}>\n {block.type}\n </span>\n <span style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n }}>\n {getLabel(block)}\n </span>\n <span style={{\n fontFamily: 'monospace',\n fontSize: 10,\n flexShrink: 0,\n padding: '1px 5px',\n borderRadius: 3,\n ...(changeType === 'added'\n ? { background: 'rgba(16,185,129,0.2)', color: '#34d399' }\n : changeType === 'moved'\n ? { background: 'rgba(245,158,11,0.2)', color: '#fbbf24' }\n : { background: 'rgba(128,128,128,0.15)', color: 'rgba(200,200,200,0.4)' }),\n }}>\n {String(block.order)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n","import type { BaseBlock } from '../core/types'\n\n/**\n * A nested/tree representation of a block.\n * Omits `parentId` and `order` since they are reconstructed during flattening.\n */\nexport type NestedBlock<T extends BaseBlock> = Omit<T, 'parentId' | 'order'> & {\n children: NestedBlock<T>[]\n}\n\n/**\n * Convert a flat block array into a nested tree structure.\n * Groups blocks by parentId, sorts siblings by order, and recursively builds children arrays.\n */\nexport function flatToNested<T extends BaseBlock>(blocks: T[]): NestedBlock<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 if (list) {\n list.push(block)\n } else {\n byParent.set(key, [block])\n }\n }\n\n // Sort each group by order\n for (const list of byParent.values()) {\n list.sort((a, b) => {\n if (typeof a.order === 'string' && typeof b.order === 'string') {\n return a.order < b.order ? -1 : a.order > b.order ? 1 : 0\n }\n return Number(a.order) - Number(b.order)\n })\n }\n\n function buildChildren(parentId: string | null): NestedBlock<T>[] {\n const siblings = byParent.get(parentId) ?? []\n return siblings.map(block => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { parentId: _p, order: _o, ...rest } = block\n return {\n ...rest,\n children: buildChildren(block.id),\n } as NestedBlock<T>\n })\n }\n\n return buildChildren(null)\n}\n\n/**\n * Convert a nested tree structure back to a flat block array.\n * DFS walk assigning parentId and integer order on the way down.\n */\nexport function nestedToFlat<T extends BaseBlock>(nested: NestedBlock<T>[]): T[] {\n const result: T[] = []\n\n function walk(nodes: NestedBlock<T>[], parentId: string | null) {\n for (let i = 0; i < nodes.length; i++) {\n const { children, ...rest } = nodes[i]\n result.push({\n ...rest,\n parentId,\n order: i,\n } as unknown as T)\n walk(children, (rest as { id: string }).id)\n }\n }\n\n walk(nested, null)\n return result\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/components/BlockTreeSSR.tsx","../src/hooks/useBlockState.tsx","../src/hooks/useTreeState.tsx","../src/hooks/useBlockHistory.tsx","../src/hooks/useLayoutAnimation.tsx","../src/hooks/useVirtualTree.tsx","../src/components/BlockTreeDevTools.tsx","../src/utils/serialization.ts"],"names":["jsx","memo","DndKitDragOverlay","jsxs","Fragment","expandedMap","containers","useCallback","useEffect","activeBlock","baseIndex","useState","state","useReducer","useMemo","children","createContext","useContext","useRef"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ReactNode } from 'react'\nimport type { UniqueIdentifier, CollisionDetection } from '@dnd-kit/core'\n\n/**\n * Base block interface - extend this for your custom block types\n */\nexport interface BaseBlock {\n id: string\n type: string\n parentId: string | null\n /** 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 /** Override the default long-press delay (200ms) for touch sensors */\n longPressDelay?: number\n /** Trigger haptic feedback (vibration) on drag start for touch devices */\n hapticFeedback?: boolean\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\nexport type SnapshotRectsRef = { current: Map<UniqueIdentifier, DOMRect> | null }\n\ninterface WeightedCollisionData {\n droppableContainer: Parameters<CollisionDetection>[0]['droppableContainers'][number]\n value: number\n left: number\n}\n\nfunction collisionValue(d: CollisionDescriptor): number {\n return (d.data as WeightedCollisionData).value\n}\n\nfunction collisionLeft(d: CollisionDescriptor): number {\n return (d.data as WeightedCollisionData).left\n}\n\n/**\n * Compute collision scores for drop zones\n * Considers both vertical distance and horizontal containment\n *\n * When snapshotRects is provided, uses snapshotted rects instead of live DOM\n * rects. This prevents feedback loops caused by in-flow ghost previews\n * shifting zone positions during drag.\n */\nfunction computeCollisionScores(\n droppableContainers: Parameters<CollisionDetection>[0]['droppableContainers'],\n collisionRect: NonNullable<Parameters<CollisionDetection>[0]['collisionRect']>,\n snapshotRects?: Map<UniqueIdentifier, DOMRect> | null\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 = snapshotRects?.get(container.id) ?? 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 whose indentation matches the pointer.\n // The factor (0.3) is tuned so a typical indentation gap (~48px) produces\n // a score difference (~14) that can overcome a reduced sticky threshold\n // for cross-depth transitions.\n const isWithinX = pointerX >= rect.left && pointerX <= rect.right\n\n let horizontalScore = 0\n if (isWithinX) {\n horizontalScore = Math.abs(pointerX - rect.left) * 0.3\n } else {\n const distanceToZone = pointerX < rect.left\n ? rect.left - pointerX\n : pointerX - rect.right\n horizontalScore = distanceToZone * 2\n }\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value: edgeDistance + bias + horizontalScore,\n left: rect.left,\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) => collisionValue(a) - collisionValue(b))\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 * @param snapshotRef - Optional ref to snapshotted zone rects. When populated,\n * collision detection uses these frozen rects instead of live DOM measurements,\n * preventing layout-shift feedback loops from in-flow ghost previews.\n */\nexport function createStickyCollision(\n threshold = 15,\n snapshotRef?: SnapshotRectsRef\n): 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, snapshotRef?.current)\n if (candidates.length === 0) return []\n\n const bestCandidate = candidates[0]\n const bestScore = collisionValue(bestCandidate)\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 = collisionValue(currentCandidate)\n\n // Use reduced threshold for cross-depth transitions (different indentation\n // levels). Same-depth zones get full stickiness to prevent flickering;\n // cross-depth zones are responsive so users can move in/out of containers.\n const currentLeft = collisionLeft(currentCandidate)\n const bestLeft = collisionLeft(bestCandidate)\n const crossDepth = Math.abs(currentLeft - bestLeft) > 20\n const effectiveThreshold = crossDepth ? threshold * 0.25 : threshold\n\n // Only switch if new winner is significantly better (by threshold)\n if (currentScore - bestScore < effectiveThreshold) {\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) => collisionValue(a) - collisionValue(b))\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: config.longPressDelay ?? 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\n/**\n * Trigger haptic feedback (vibration) on supported devices.\n * Safe to call in any environment — no-ops when `navigator.vibrate` is unavailable.\n */\nexport function triggerHaptic(durationMs = 10): void {\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') {\n navigator.vibrate(durationMs)\n }\n}\n","'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, memo, type ReactNode } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport type { BaseBlock, InternalRenderers, ContainerRendererProps, CanDragFn, AnimationConfig } 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 /** Animation configuration */\n animation?: AnimationConfig\n /** When virtual scrolling is active, only render blocks in this set */\n virtualVisibleIds?: Set<string> | null\n}\n\n/**\n * Ghost preview wrapper — renders in normal document flow so the user sees\n * an accurate preview of the final layout. Collision detection uses\n * snapshotted zone rects to avoid feedback loops from the ghost's displacement.\n */\nfunction GhostPreview({ children }: { children: ReactNode }) {\n return (\n <div data-dnd-ghost className=\"opacity-50\" style={{ pointerEvents: 'none' }}>\n {children}\n </div>\n )\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 isContainer,\n isExpanded,\n depth,\n posInSet,\n setSize,\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 isContainer?: boolean\n isExpanded?: boolean\n depth: number\n posInSet: number\n setSize: number\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 aria-level={depth + 1}\n aria-posinset={posInSet}\n aria-setsize={setSize}\n aria-expanded={isContainer ? isExpanded : undefined}\n aria-selected={isSelected ?? undefined}\n >\n {children({ isDragging })}\n </div>\n )\n}\n\n/**\n * Recursive tree renderer with smart drop zones\n */\nfunction TreeRendererInner<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 animation,\n virtualVisibleIds,\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 let filteredBlocks = items.filter(block => block.id !== activeId)\n\n // When virtual scrolling is active at root level, only render visible blocks\n if (virtualVisibleIds && depth === 0) {\n filteredBlocks = filteredBlocks.filter(block => virtualVisibleIds.has(block.id))\n }\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 — out-of-flow so it doesn't shift zones */}\n {ghostBeforeThis && GhostRenderer && (\n <GhostPreview>\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </GhostPreview>\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 isContainer={isContainer}\n isExpanded={isExpanded}\n depth={depth}\n posInSet={originalIndex + 1}\n setSize={items.length}\n >\n {({ isDragging }) => {\n if (isContainer) {\n const expandStyle = animation?.expandDuration\n ? {\n transition: `opacity ${animation.expandDuration}ms ${animation.easing ?? 'ease'}`,\n opacity: isExpanded ? 1 : 0,\n }\n : undefined\n\n const childContent = isExpanded ? (\n <div style={expandStyle}>\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 animation={animation}\n virtualVisibleIds={virtualVisibleIds}\n />\n </div>\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 — out-of-flow so it doesn't shift the end zone */}\n {showGhostHere && previewPosition!.index >= filteredBlocks.length && draggedBlock && (() => {\n const GhostRenderer = renderers[draggedBlock.type as keyof typeof renderers]\n return GhostRenderer ? (\n <GhostPreview>\n {GhostRenderer({\n block: draggedBlock as T & { type: typeof draggedBlock.type },\n isDragging: true,\n depth,\n })}\n </GhostPreview>\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\nexport const TreeRenderer = memo(TreeRendererInner) as typeof TreeRendererInner\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 // Cannot move a block into its own descendants\n if (newParentId !== null && getDescendantIds(state, dragged.id).has(newParentId)) {\n return state\n }\n\n // Compute target insert index (before any mutation) for no-op detection\n const oldList = byParent.get(oldParentId) ?? []\n const currentIndexInOldParent = oldList.indexOf(dragged.id)\n\n // Compute what the target index would be in the new parent's child list\n const preNewList = byParent.get(newParentId) ?? []\n let targetIndex: number\n if (isInto) {\n targetIndex = 0\n } else if (isEnd) {\n targetIndex = preNewList.length\n } else {\n const idx = preNewList.indexOf(zoneTargetId)\n targetIndex = idx === -1 ? preNewList.length : isAfter ? idx + 1 : idx\n }\n\n // No-op detection: if same parent, adjust target for removal\n if (oldParentId === newParentId && currentIndexInOldParent !== -1) {\n const adjustedTarget = targetIndex > currentIndexInOldParent\n ? targetIndex - 1\n : targetIndex\n if (adjustedTarget === currentIndexInOldParent) {\n return state\n }\n }\n\n // Remove dragged from old parent\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 insertIndex = 0\n } else if (isEnd) {\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 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 const visited = new Set<string>()\n while (current !== null) {\n if (visited.has(current)) break\n visited.add(current)\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 visited = new Set<string>()\n): number {\n if (visited.has(blockId)) return 0\n visited.add(blockId)\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, visited))\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 * Result of validating a block tree\n */\nexport interface TreeValidationResult {\n valid: boolean\n issues: string[]\n}\n\n/**\n * Validate a block tree index for structural integrity.\n * Checks for cycles, orphans (parentId references non-existent block),\n * and stale refs (byParent lists IDs not present in byId).\n *\n * Opt-in utility — not called automatically.\n */\nexport function validateBlockTree<T extends BaseBlock>(\n index: BlockIndex<T>\n): TreeValidationResult {\n const issues: string[] = []\n\n // Check for cycles: walk parentId chain with visited set\n for (const [id] of index.byId) {\n const visited = new Set<string>()\n let current: string | null = id\n while (current !== null) {\n if (visited.has(current)) {\n issues.push(`Cycle detected: block \"${id}\" has a circular parentId chain`)\n break\n }\n visited.add(current)\n const block = index.byId.get(current)\n current = block?.parentId ?? null\n }\n }\n\n // Check for orphans: parentId points to non-existent ID\n for (const [id, block] of index.byId) {\n if (block.parentId !== null && !index.byId.has(block.parentId)) {\n issues.push(`Orphan: block \"${id}\" references non-existent parent \"${block.parentId}\"`)\n }\n }\n\n // Check for stale refs: byParent lists contain IDs not in byId\n for (const [parentId, childIds] of index.byParent) {\n for (const childId of childIds) {\n if (!index.byId.has(childId)) {\n issues.push(`Stale ref: byParent key \"${parentId}\" lists non-existent block \"${childId}\"`)\n }\n }\n }\n\n if (issues.length > 0) {\n for (const issue of issues) {\n console.warn(`[dnd-block-tree] ${issue}`)\n }\n }\n\n return { valid: issues.length === 0, issues }\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, useState, 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, type SnapshotRectsRef } 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, triggerHaptic } 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 /** Enable virtual scrolling for large trees (fixed item height only) */\n virtualize?: {\n /** Fixed height of each item in pixels */\n itemHeight: number\n /** Number of extra items to render outside the visible range (default: 5) */\n overscan?: number\n }\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 const expandedMap: Record<string, boolean> = {}\n const containers = blocks.filter(b => containerTypes.includes(b.type))\n for (const container of containers) {\n expandedMap[container.id] = false\n }\n return expandedMap\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 animation,\n initialExpanded,\n orderingStrategy = 'integer',\n maxDepth,\n keyboardNavigation = false,\n multiSelect = false,\n selectedIds: externalSelectedIds,\n onSelectionChange,\n virtualize,\n}: BlockTreeProps<T, C>) {\n const sensors = useConfiguredSensors({\n activationDistance: sensorConfig?.activationDistance ?? activationDistance,\n activationDelay: sensorConfig?.activationDelay,\n tolerance: sensorConfig?.tolerance,\n longPressDelay: sensorConfig?.longPressDelay,\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 // Snapshotted drop zone rects — collision detection reads from this instead\n // of live DOM to prevent feedback loops caused by in-flow ghost previews.\n const snapshotRectsRef = useRef<Map<string, DOMRect> | null>(null) as SnapshotRectsRef\n const needsResnapshot = useRef(false)\n\n // Sticky collision with hysteresis to prevent flickering between adjacent zones\n const stickyCollisionRef = useRef(createStickyCollision(20, snapshotRectsRef))\n\n // Snapshot all drop zone rects from the DOM\n const snapshotZoneRects = useCallback(() => {\n const root = rootRef.current\n if (!root) return\n const zones = root.querySelectorAll('[data-zone-id]')\n const map = new Map<string, DOMRect>()\n zones.forEach(el => {\n const id = el.getAttribute('data-zone-id')\n if (id) map.set(id, el.getBoundingClientRect())\n })\n snapshotRectsRef.current = map\n }, [])\n\n // Force re-render\n const [, forceRender] = useReducer((x: number) => x + 1, 0)\n\n // Debounced virtual state setter — also flags re-snapshot after ghost moves\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 needsResnapshot.current = true\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 = useMemo(\n () => computeNormalizedIndex(blocks, orderingStrategy),\n [blocks, orderingStrategy]\n )\n\n // Blocks by parent for rendering - always use original for stable zones\n const blocksByParent = useMemo(() => {\n const map = new Map<string | null, T[]>()\n for (const [parentId, ids] of originalIndex.byParent.entries()) {\n map.set(parentId, ids.map(id => originalIndex.byId.get(id)!).filter(Boolean))\n }\n return map\n }, [originalIndex])\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 // Re-snapshot zone rects after DOM settles (ghost moved to new position)\n useEffect(() => {\n if (!needsResnapshot.current || !stateRef.current.isDragging) return\n needsResnapshot.current = false\n // Wait for browser to paint the new ghost position before measuring\n requestAnimationFrame(() => {\n snapshotZoneRects()\n })\n })\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 // Trigger haptic feedback if configured\n if (sensorConfig?.hapticFeedback) {\n triggerHaptic()\n }\n\n stateRef.current.activeId = id\n stateRef.current.isDragging = true\n initialBlocksRef.current = [...blocks]\n cachedReorderRef.current = null\n needsResnapshot.current = true\n forceRender()\n }, [blocks, canDrag, onDragStart, multiSelect, selectedIds, setSelectedIds, visibleBlockIds, sensorConfig?.hapticFeedback])\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 snapshotRectsRef.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 snapshotRectsRef.current = null\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 snapshotRectsRef.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 // 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 // --- Virtual scrolling ---\n const virtualContainerRef = useRef<HTMLDivElement>(null)\n const [virtualScroll, setVirtualScroll] = useState({ scrollTop: 0, clientHeight: 0 })\n\n useEffect(() => {\n if (!virtualize) return\n const el = virtualContainerRef.current\n if (!el) return\n\n setVirtualScroll({ scrollTop: el.scrollTop, clientHeight: el.clientHeight })\n\n const onScroll = () => {\n setVirtualScroll({ scrollTop: el.scrollTop, clientHeight: el.clientHeight })\n }\n el.addEventListener('scroll', onScroll, { passive: true })\n return () => el.removeEventListener('scroll', onScroll)\n }, [virtualize])\n\n const virtualResult = useMemo(() => {\n if (!virtualize) return null\n\n const { itemHeight, overscan = 5 } = virtualize\n const { scrollTop, clientHeight } = virtualScroll\n const totalHeight = visibleBlockIds.length * itemHeight\n const startRaw = Math.floor(scrollTop / itemHeight)\n const visibleCount = Math.ceil(clientHeight / itemHeight)\n const start = Math.max(0, startRaw - overscan)\n const end = Math.min(visibleBlockIds.length - 1, startRaw + visibleCount + overscan)\n const offsetY = start * itemHeight\n\n const visibleSet = new Set<string>()\n for (let i = start; i <= end; i++) {\n visibleSet.add(visibleBlockIds[i])\n }\n\n return { totalHeight, offsetY, visibleSet }\n }, [virtualize, virtualScroll, visibleBlockIds])\n\n const treeContent = (\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 animation={animation}\n virtualVisibleIds={virtualResult?.visibleSet ?? null}\n />\n )\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 {virtualize ? (\n <div\n ref={(el) => {\n (virtualContainerRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n (rootRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n }}\n className={className}\n style={{ minWidth: 0, overflow: 'auto', position: 'relative' }}\n onKeyDown={keyboardNavigation ? handleKeyDown : undefined}\n role={keyboardNavigation ? 'tree' : undefined}\n >\n <div style={{ height: virtualResult!.totalHeight, position: 'relative' }}>\n <div style={{ position: 'absolute', top: virtualResult!.offsetY, left: 0, right: 0 }}>\n {treeContent}\n </div>\n </div>\n </div>\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 {treeContent}\n </div>\n )}\n <DragOverlay activeBlock={activeBlock} selectedCount={multiSelect ? selectedIds.size : 0}>\n {dragOverlay}\n </DragOverlay>\n </DndContext>\n )\n}\n","'use client'\n\nimport { useState, useEffect, type ReactNode } from 'react'\nimport { BlockTree, type BlockTreeProps } from './BlockTree'\nimport type { BaseBlock } from '../core/types'\n\nexport interface BlockTreeSSRProps<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n> extends BlockTreeProps<T, C> {\n /** Content to render before hydration completes (default: null) */\n fallback?: ReactNode\n}\n\n/**\n * Hydration-safe wrapper for BlockTree in SSR environments.\n * Renders the fallback (or nothing) on the server and during initial hydration,\n * then mounts the full BlockTree after the client has hydrated.\n */\nexport function BlockTreeSSR<\n T extends BaseBlock,\n C extends readonly T['type'][] = readonly T['type'][]\n>({ fallback = null, ...props }: BlockTreeSSRProps<T, C>) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return <>{fallback}</>\n }\n\n return <BlockTree<T, C> {...props} />\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","'use client'\n\nimport { useRef, useLayoutEffect } from 'react'\n\nexport interface UseLayoutAnimationOptions {\n /** Duration of the transition in ms (default: 200) */\n duration?: number\n /** CSS easing function (default: 'ease') */\n easing?: string\n /** CSS selector for animated children (default: '[data-block-id]') */\n selector?: string\n}\n\n/**\n * FLIP-based layout animation hook for reorder transitions.\n *\n * Captures block positions before render (layout effect cleanup),\n * computes the delta after render, and applies a CSS transform transition.\n *\n * Usage:\n * ```tsx\n * const containerRef = useRef<HTMLDivElement>(null)\n * useLayoutAnimation(containerRef, { duration: 200 })\n * return <div ref={containerRef}>...</div>\n * ```\n */\nexport function useLayoutAnimation(\n containerRef: React.RefObject<HTMLElement | null>,\n options: UseLayoutAnimationOptions = {}\n) {\n const {\n duration = 200,\n easing = 'ease',\n selector = '[data-block-id]',\n } = options\n\n // Store previous positions keyed by data-block-id\n const prevPositions = useRef(new Map<string, DOMRect>())\n\n useLayoutEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const children = container.querySelectorAll(selector)\n const currentPositions = new Map<string, DOMRect>()\n\n // Capture current (post-render) positions\n children.forEach(el => {\n const id = (el as HTMLElement).dataset.blockId\n if (id) {\n currentPositions.set(id, el.getBoundingClientRect())\n }\n })\n\n // Apply FLIP animation for elements that moved\n children.forEach(el => {\n const htmlEl = el as HTMLElement\n const id = htmlEl.dataset.blockId\n if (!id) return\n\n const prev = prevPositions.current.get(id)\n const curr = currentPositions.get(id)\n if (!prev || !curr) return\n\n const deltaY = prev.top - curr.top\n const deltaX = prev.left - curr.left\n\n if (deltaY === 0 && deltaX === 0) return\n\n // First: apply inverse transform (move to old position)\n htmlEl.style.transform = `translate(${deltaX}px, ${deltaY}px)`\n htmlEl.style.transition = 'none'\n\n // Play: animate to new position\n requestAnimationFrame(() => {\n htmlEl.style.transition = `transform ${duration}ms ${easing}`\n htmlEl.style.transform = ''\n\n const onEnd = () => {\n htmlEl.style.transition = ''\n htmlEl.removeEventListener('transitionend', onEnd)\n }\n htmlEl.addEventListener('transitionend', onEnd)\n })\n })\n\n // Store current positions for next render\n prevPositions.current = currentPositions\n })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\n\nexport interface UseVirtualTreeOptions {\n /** Ref to the scrollable container element */\n containerRef: React.RefObject<HTMLElement | null>\n /** Total number of items in the tree */\n itemCount: number\n /** Fixed height of each item in pixels */\n itemHeight: number\n /** Number of extra items to render outside the visible range (default: 5) */\n overscan?: number\n}\n\nexport interface UseVirtualTreeResult {\n /** Start and end indices of the visible range (inclusive) */\n visibleRange: { start: number; end: number }\n /** Total height of all items for the spacer div */\n totalHeight: number\n /** Offset from top for the first rendered item */\n offsetY: number\n}\n\n/**\n * Lightweight fixed-height virtual scrolling hook for tree lists.\n *\n * Tracks scroll position on the container and computes which items\n * should be rendered based on the viewport and overscan.\n */\nexport function useVirtualTree({\n containerRef,\n itemCount,\n itemHeight,\n overscan = 5,\n}: UseVirtualTreeOptions): UseVirtualTreeResult {\n const [scrollTop, setScrollTop] = useState(0)\n const [containerHeight, setContainerHeight] = useState(0)\n const rafId = useRef(0)\n\n const handleScroll = useCallback(() => {\n cancelAnimationFrame(rafId.current)\n rafId.current = requestAnimationFrame(() => {\n const el = containerRef.current\n if (el) {\n setScrollTop(el.scrollTop)\n setContainerHeight(el.clientHeight)\n }\n })\n }, [containerRef])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n\n // Initialize\n setScrollTop(el.scrollTop)\n setContainerHeight(el.clientHeight)\n\n el.addEventListener('scroll', handleScroll, { passive: true })\n return () => {\n el.removeEventListener('scroll', handleScroll)\n cancelAnimationFrame(rafId.current)\n }\n }, [containerRef, handleScroll])\n\n const totalHeight = itemCount * itemHeight\n\n // Compute visible range\n const startRaw = Math.floor(scrollTop / itemHeight)\n const visibleCount = Math.ceil(containerHeight / itemHeight)\n const start = Math.max(0, startRaw - overscan)\n const end = Math.min(itemCount - 1, startRaw + visibleCount + overscan)\n\n const offsetY = start * itemHeight\n\n return {\n visibleRange: { start, end },\n totalHeight,\n offsetY,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useMemo, useEffect } from 'react'\nimport type { BaseBlock, BlockTreeCallbacks, DragStartEvent, DragEndEvent, BlockMoveEvent, ExpandChangeEvent, HoverChangeEvent } from '../core/types'\nimport { computeNormalizedIndex, validateBlockTree, getBlockDepth } from '../utils/blocks'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DevToolsEventEntry {\n id: number\n timestamp: number\n type: 'dragStart' | 'dragEnd' | 'blockMove' | 'expandChange' | 'hoverChange'\n summary: string\n}\n\nexport interface DevToolsCallbacks<T extends BaseBlock = BaseBlock> {\n onDragStart: NonNullable<BlockTreeCallbacks<T>['onDragStart']>\n onDragEnd: NonNullable<BlockTreeCallbacks<T>['onDragEnd']>\n onBlockMove: NonNullable<BlockTreeCallbacks<T>['onBlockMove']>\n onExpandChange: NonNullable<BlockTreeCallbacks<T>['onExpandChange']>\n onHoverChange: NonNullable<BlockTreeCallbacks<T>['onHoverChange']>\n}\n\nexport interface BlockTreeDevToolsProps<T extends BaseBlock = BaseBlock> {\n blocks: T[]\n containerTypes?: readonly string[]\n events: DevToolsEventEntry[]\n onClearEvents: () => void\n /** Label function for diff view (default: block.type) */\n getLabel?: (block: T) => string\n /** Initial open state (default: false) */\n initialOpen?: boolean\n /** Position of the trigger button (default: 'bottom-left') */\n position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'\n /** Custom inline styles for the trigger button */\n buttonStyle?: React.CSSProperties\n /** Custom inline styles for the card panel */\n panelStyle?: React.CSSProperties\n /** Force mount in production (default: false). DevTools renders nothing in production unless this is true. */\n forceMount?: boolean\n}\n\n// ============================================================================\n// Hook: useDevToolsCallbacks\n// ============================================================================\n\nconst MAX_EVENTS = 100\n\nexport function useDevToolsCallbacks<T extends BaseBlock = BaseBlock>() {\n const [events, setEvents] = useState<DevToolsEventEntry[]>([])\n const nextIdRef = useRef(1)\n\n const addEvent = useCallback((type: DevToolsEventEntry['type'], summary: string) => {\n const entry: DevToolsEventEntry = {\n id: nextIdRef.current++,\n timestamp: Date.now(),\n type,\n summary,\n }\n setEvents(prev => [entry, ...prev].slice(0, MAX_EVENTS))\n }, [])\n\n const clearEvents = useCallback(() => {\n setEvents([])\n }, [])\n\n const callbacks: DevToolsCallbacks<T> = useMemo(() => ({\n onDragStart: (event: DragStartEvent<T>) => {\n addEvent('dragStart', `Started dragging \"${event.blockId}\"`)\n },\n onDragEnd: (event: DragEndEvent<T>) => {\n if (event.cancelled) {\n addEvent('dragEnd', `Cancelled drag of \"${event.blockId}\"`)\n } else {\n addEvent('dragEnd', `Dropped \"${event.blockId}\" at ${event.targetZone ?? 'none'}`)\n }\n },\n onBlockMove: (event: BlockMoveEvent<T>) => {\n const fromStr = `parent=${event.from.parentId ?? 'root'}[${event.from.index}]`\n const toStr = `parent=${event.to.parentId ?? 'root'}[${event.to.index}]`\n const ids = event.movedIds.length > 1 ? ` (${event.movedIds.length} blocks)` : ''\n addEvent('blockMove', `Moved \"${event.block.id}\" from ${fromStr} to ${toStr}${ids}`)\n },\n onExpandChange: (event: ExpandChangeEvent<T>) => {\n addEvent('expandChange', `${event.expanded ? 'Expanded' : 'Collapsed'} \"${event.blockId}\"`)\n },\n onHoverChange: (event: HoverChangeEvent<T>) => {\n if (event.zoneId) {\n addEvent('hoverChange', `Hovering over zone \"${event.zoneId}\"`)\n }\n },\n }), [addEvent])\n\n return { callbacks, events, clearEvents }\n}\n\n// ============================================================================\n// Logo SVG\n// ============================================================================\n\nfunction DevToolsLogo({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"5\" rx=\"1\" fill=\"#3b82f6\" opacity=\"0.9\" />\n <rect x=\"8\" y=\"10\" width=\"8\" height=\"5\" rx=\"1\" fill=\"#10b981\" opacity=\"0.9\" />\n <rect x=\"14\" y=\"18\" width=\"8\" height=\"5\" rx=\"1\" fill=\"#f59e0b\" opacity=\"0.9\" />\n <path d=\"M6 7 L6 10 L8 10\" stroke=\"#888\" strokeWidth=\"1.5\" fill=\"none\" opacity=\"0.6\" />\n <path d=\"M12 15 L12 18 L14 18\" stroke=\"#888\" strokeWidth=\"1.5\" fill=\"none\" opacity=\"0.6\" />\n </svg>\n )\n}\n\n// ============================================================================\n// Diff computation (inline, no external deps)\n// ============================================================================\n\ntype ChangeType = 'added' | 'moved' | 'unchanged'\n\ninterface DiffEntry<T extends BaseBlock> {\n block: T\n changeType: ChangeType\n depth: number\n}\n\nfunction computeDiffMap<T extends BaseBlock>(prev: T[], next: T[]): Map<string, ChangeType> {\n const prevMap = new Map(prev.map(b => [b.id, b]))\n const changeMap = new Map<string, ChangeType>()\n for (const block of next) {\n const prevBlock = prevMap.get(block.id)\n if (!prevBlock) {\n changeMap.set(block.id, 'added')\n } else if (prevBlock.parentId !== block.parentId || prevBlock.order !== block.order) {\n changeMap.set(block.id, 'moved')\n } else {\n changeMap.set(block.id, 'unchanged')\n }\n }\n return changeMap\n}\n\nfunction buildDiffTree<T extends BaseBlock>(blocks: T[], changeMap: Map<string, ChangeType>): DiffEntry<T>[] {\n const result: DiffEntry<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 function walk(parentId: string | null, depth: number) {\n const children = byParent.get(parentId) ?? []\n children.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 for (const block of children) {\n result.push({ block, changeType: changeMap.get(block.id) ?? 'unchanged', depth })\n walk(block.id, depth + 1)\n }\n }\n walk(null, 0)\n return result\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst TYPE_COLORS: Record<DevToolsEventEntry['type'], string> = {\n dragStart: '#3b82f6',\n dragEnd: '#10b981',\n blockMove: '#f59e0b',\n expandChange: '#8b5cf6',\n hoverChange: '#6b7280',\n}\n\nconst TYPE_LABELS: Record<DevToolsEventEntry['type'], string> = {\n dragStart: 'DRAG',\n dragEnd: 'DROP',\n blockMove: 'MOVE',\n expandChange: 'EXPAND',\n hoverChange: 'HOVER',\n}\n\nconst TYPE_TOOLTIPS: Record<DevToolsEventEntry['type'], string> = {\n dragStart: 'onDragStart — a block was picked up',\n dragEnd: 'onDragEnd — a block was dropped or drag was cancelled',\n blockMove: 'onBlockMove — a block was reparented to a new position',\n expandChange: 'onExpandChange — a container was expanded or collapsed',\n hoverChange: 'onHoverChange — the pointer entered a drop zone',\n}\n\nconst DEFAULT_WIDTH = 340\nconst DEFAULT_HEIGHT = 420\nconst DIFF_EXTRA_WIDTH = 300\nconst MIN_WIDTH = 280\nconst MIN_HEIGHT = 200\nconst BTN_SIZE = 40\nconst BTN_MARGIN = 16\nconst STORAGE_KEY = 'dnd-devtools-position'\nconst BTN_DRAG_THRESHOLD = 5\n\ntype Corner = NonNullable<BlockTreeDevToolsProps['position']>\n\nfunction cornerToXY(corner: Corner): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1024\n const vh = typeof window !== 'undefined' ? window.innerHeight : 768\n switch (corner) {\n case 'top-left': return { x: BTN_MARGIN, y: BTN_MARGIN }\n case 'top-right': return { x: vw - BTN_MARGIN - BTN_SIZE, y: BTN_MARGIN }\n case 'bottom-right': return { x: vw - BTN_MARGIN - BTN_SIZE, y: vh - BTN_MARGIN - BTN_SIZE }\n case 'bottom-left':\n default: return { x: BTN_MARGIN, y: vh - BTN_MARGIN - BTN_SIZE }\n }\n}\n\nfunction xyToCorner(x: number, y: number): Corner {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1024\n const vh = typeof window !== 'undefined' ? window.innerHeight : 768\n const isLeft = x + BTN_SIZE / 2 < vw / 2\n const isTop = y + BTN_SIZE / 2 < vh / 2\n if (isTop && isLeft) return 'top-left'\n if (isTop) return 'top-right'\n if (isLeft) return 'bottom-left'\n return 'bottom-right'\n}\n\nfunction loadStoredPosition(): Corner | null {\n if (typeof window === 'undefined') return null\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'bottom-left' || v === 'bottom-right' || v === 'top-left' || v === 'top-right') return v\n } catch { /* ignore */ }\n return null\n}\n\nfunction savePosition(corner: Corner) {\n try { localStorage.setItem(STORAGE_KEY, corner) } catch { /* ignore */ }\n}\n\nfunction computeCardOrigin(corner: Corner, width: number, height: number): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1024\n const vh = typeof window !== 'undefined' ? window.innerHeight : 768\n // Compute ideal position, then clamp to viewport\n let x: number\n let y: number\n switch (corner) {\n case 'bottom-right':\n x = vw - BTN_MARGIN - width\n y = vh - BTN_MARGIN - height - BTN_SIZE - 8\n break\n case 'top-left':\n x = BTN_MARGIN\n y = BTN_MARGIN + BTN_SIZE + 8\n break\n case 'top-right':\n x = vw - BTN_MARGIN - width\n y = BTN_MARGIN + BTN_SIZE + 8\n break\n case 'bottom-left':\n default:\n x = BTN_MARGIN\n y = vh - BTN_MARGIN - height - BTN_SIZE - 8\n break\n }\n // Clamp to viewport bounds\n return {\n x: Math.max(0, Math.min(x, vw - width)),\n y: Math.max(0, Math.min(y, vh - height)),\n }\n}\n\n// ============================================================================\n// Component: BlockTreeDevTools\n// ============================================================================\n\nexport function BlockTreeDevTools<T extends BaseBlock = BaseBlock>({\n blocks,\n containerTypes = [],\n events,\n onClearEvents,\n getLabel = (b) => b.type,\n initialOpen = false,\n position = 'bottom-left',\n buttonStyle,\n panelStyle,\n forceMount = false,\n}: BlockTreeDevToolsProps<T>) {\n // Don't render in production unless explicitly forced\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production' && !forceMount) {\n return null\n }\n const [isOpen, setIsOpen] = useState(initialOpen)\n const [showDiff, setShowDiff] = useState(false)\n const [cardPos, setCardPos] = useState<{ x: number; y: number } | null>(null)\n const [cardSize, setCardSize] = useState<{ w: number; h: number }>({ w: DEFAULT_WIDTH, h: DEFAULT_HEIGHT })\n const [showTooltip, setShowTooltip] = useState(false)\n\n // ---------- Corner position (draggable trigger button) ----------\n\n const [activeCorner, setActiveCorner] = useState<Corner>(() => loadStoredPosition() ?? position)\n const [btnPos, setBtnPos] = useState<{ x: number; y: number }>(() => cornerToXY(loadStoredPosition() ?? position))\n const [btnDragging, setBtnDragging] = useState(false)\n const [btnTransition, setBtnTransition] = useState(false)\n const btnDragRef = useRef<{ active: boolean; startX: number; startY: number; origX: number; origY: number; moved: boolean }>({\n active: false, startX: 0, startY: 0, origX: 0, origY: 0, moved: false,\n })\n\n // Sync btnPos when activeCorner changes (and on window resize)\n useEffect(() => {\n if (!btnDragging) {\n setBtnPos(cornerToXY(activeCorner))\n }\n }, [activeCorner, btnDragging])\n\n useEffect(() => {\n const onResize = () => {\n if (!btnDragRef.current.active) {\n setBtnPos(cornerToXY(activeCorner))\n }\n }\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [activeCorner])\n\n const handleBtnPointerDown = useCallback((e: React.PointerEvent) => {\n btnDragRef.current = {\n active: true,\n startX: e.clientX,\n startY: e.clientY,\n origX: btnPos.x,\n origY: btnPos.y,\n moved: false,\n }\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [btnPos])\n\n const handleBtnPointerMove = useCallback((e: React.PointerEvent) => {\n const r = btnDragRef.current\n if (!r.active) return\n const dx = e.clientX - r.startX\n const dy = e.clientY - r.startY\n if (!r.moved && Math.abs(dx) < BTN_DRAG_THRESHOLD && Math.abs(dy) < BTN_DRAG_THRESHOLD) return\n r.moved = true\n setBtnDragging(true)\n const newX = r.origX + dx\n const newY = r.origY + dy\n const maxX = window.innerWidth - BTN_SIZE\n const maxY = window.innerHeight - BTN_SIZE\n setBtnPos({\n x: Math.max(0, Math.min(newX, maxX)),\n y: Math.max(0, Math.min(newY, maxY)),\n })\n }, [])\n\n const handleBtnPointerUp = useCallback(() => {\n const wasMoved = btnDragRef.current.moved\n btnDragRef.current.active = false\n if (wasMoved) {\n // Snap to nearest corner\n const newCorner = xyToCorner(btnPos.x, btnPos.y)\n setActiveCorner(newCorner)\n savePosition(newCorner)\n // Ease to corner target\n setBtnTransition(true)\n setBtnPos(cornerToXY(newCorner))\n setTimeout(() => {\n setBtnTransition(false)\n setBtnDragging(false)\n }, 300)\n } else {\n setBtnDragging(false)\n // This was a click, not a drag — toggle panel\n setIsOpen(prev => !prev)\n }\n }, [btnPos])\n\n // ---------- Card drag (title bar) ----------\n\n const dragRef = useRef<{ dragging: boolean; startX: number; startY: number; origX: number; origY: number }>({\n dragging: false, startX: 0, startY: 0, origX: 0, origY: 0,\n })\n\n // Resize state\n const resizeRef = useRef<{\n active: boolean\n edge: string\n startX: number; startY: number\n origX: number; origY: number\n origW: number; origH: number\n }>({ active: false, edge: '', startX: 0, startY: 0, origX: 0, origY: 0, origW: 0, origH: 0 })\n\n const cardRef = useRef<HTMLDivElement>(null)\n\n // Diff state tracking\n const prevBlocksRef = useRef<T[]>(blocks)\n const diffChangeMap = useMemo(() => computeDiffMap(prevBlocksRef.current, blocks), [blocks])\n useEffect(() => { prevBlocksRef.current = blocks }, [blocks])\n const diffTree = useMemo(() => buildDiffTree(blocks, diffChangeMap), [blocks, diffChangeMap])\n const diffStats = useMemo(() => {\n let added = 0, moved = 0\n for (const { changeType } of diffTree) {\n if (changeType === 'added') added++\n if (changeType === 'moved') moved++\n }\n return { added, moved }\n }, [diffTree])\n\n // Auto-widen/shrink when toggling diff, with boundary clamping\n useEffect(() => {\n setCardSize(prev => {\n const targetW = showDiff ? DEFAULT_WIDTH + DIFF_EXTRA_WIDTH : DEFAULT_WIDTH\n const wasDefault = Math.abs(prev.w - DEFAULT_WIDTH) < 20\n const wasExpanded = Math.abs(prev.w - (DEFAULT_WIDTH + DIFF_EXTRA_WIDTH)) < 20\n let newW = prev.w\n if (showDiff && (wasDefault || prev.w < targetW)) {\n newW = targetW\n } else if (!showDiff && wasExpanded) {\n newW = DEFAULT_WIDTH\n }\n if (newW !== prev.w) {\n // Clamp card position so it doesn't go off-screen\n setCardPos(cp => {\n if (!cp) return cp\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1024\n const maxX = Math.max(0, vw - newW)\n if (cp.x > maxX) return { ...cp, x: maxX }\n return cp\n })\n return { ...prev, w: newW }\n }\n return prev\n })\n }, [showDiff])\n\n // Compute initial card position\n const getDefaultCardPos = useCallback(() => {\n return computeCardOrigin(activeCorner, cardSize.w, cardSize.h)\n }, [activeCorner, cardSize.w, cardSize.h])\n\n // Set card position when opening\n useEffect(() => {\n if (isOpen && !cardPos) {\n setCardPos(getDefaultCardPos())\n }\n }, [isOpen, cardPos, getDefaultCardPos])\n\n // ---------- Card drag (title bar) ----------\n\n const handleDragPointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault()\n dragRef.current = {\n dragging: true,\n startX: e.clientX,\n startY: e.clientY,\n origX: cardPos?.x ?? 0,\n origY: cardPos?.y ?? 0,\n }\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [cardPos])\n\n const handleDragPointerMove = useCallback((e: React.PointerEvent) => {\n if (!dragRef.current.dragging) return\n const dx = e.clientX - dragRef.current.startX\n const dy = e.clientY - dragRef.current.startY\n const newX = dragRef.current.origX + dx\n const newY = dragRef.current.origY + dy\n const maxX = window.innerWidth - cardSize.w\n const maxY = window.innerHeight - 40\n setCardPos({\n x: Math.max(0, Math.min(newX, maxX)),\n y: Math.max(0, Math.min(newY, maxY)),\n })\n }, [cardSize.w])\n\n const handleDragPointerUp = useCallback(() => {\n dragRef.current.dragging = false\n }, [])\n\n // ---------- Resize ----------\n\n const handleResizePointerDown = useCallback((edge: string) => (e: React.PointerEvent) => {\n e.preventDefault()\n e.stopPropagation()\n resizeRef.current = {\n active: true,\n edge,\n startX: e.clientX,\n startY: e.clientY,\n origX: cardPos?.x ?? 0,\n origY: cardPos?.y ?? 0,\n origW: cardSize.w,\n origH: cardSize.h,\n }\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [cardPos, cardSize])\n\n const handleResizePointerMove = useCallback((e: React.PointerEvent) => {\n const r = resizeRef.current\n if (!r.active) return\n const dx = e.clientX - r.startX\n const dy = e.clientY - r.startY\n let newW = r.origW\n let newH = r.origH\n let newX = r.origX\n let newY = r.origY\n\n if (r.edge.includes('e')) newW = Math.max(MIN_WIDTH, r.origW + dx)\n if (r.edge.includes('w')) {\n newW = Math.max(MIN_WIDTH, r.origW - dx)\n newX = r.origX + (r.origW - newW)\n }\n if (r.edge.includes('s')) newH = Math.max(MIN_HEIGHT, r.origH + dy)\n if (r.edge.includes('n')) {\n newH = Math.max(MIN_HEIGHT, r.origH - dy)\n newY = r.origY + (r.origH - newH)\n }\n\n setCardSize({ w: newW, h: newH })\n setCardPos({ x: newX, y: newY })\n }, [])\n\n const handleResizePointerUp = useCallback(() => {\n resizeRef.current.active = false\n }, [])\n\n const toggle = useCallback(() => {\n setIsOpen(prev => !prev)\n }, [])\n\n const toggleDiff = useCallback(() => {\n setShowDiff(prev => !prev)\n }, [])\n\n // ---------- Stats ----------\n\n const renderCountRef = useRef(0)\n const lastRenderTimeRef = useRef(performance.now())\n const prevBlockCountRef = useRef(blocks.length)\n\n renderCountRef.current++\n const renderTime = performance.now() - lastRenderTimeRef.current\n lastRenderTimeRef.current = performance.now()\n\n const blockCountDelta = blocks.length - prevBlockCountRef.current\n useEffect(() => {\n prevBlockCountRef.current = blocks.length\n }, [blocks.length])\n\n const treeStats = useMemo(() => {\n const index = computeNormalizedIndex(blocks as BaseBlock[])\n const containers = blocks.filter(b => containerTypes.includes(b.type))\n let maxDepthVal = 0\n for (const block of blocks) {\n const d = getBlockDepth(index, block.id)\n if (d > maxDepthVal) maxDepthVal = d\n }\n const validation = validateBlockTree(index)\n return {\n blockCount: blocks.length,\n containerCount: containers.length,\n maxDepth: maxDepthVal,\n validation,\n }\n }, [blocks, containerTypes])\n\n const formatTime = (ts: number) => {\n const d = new Date(ts)\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}`\n }\n\n // ---------- Styles ----------\n\n const isBottom = activeCorner.startsWith('bottom')\n const isLeft = activeCorner.endsWith('left')\n\n const triggerBtnStyle: React.CSSProperties = {\n position: 'fixed',\n left: btnPos.x,\n top: btnPos.y,\n zIndex: 99998,\n width: BTN_SIZE,\n height: BTN_SIZE,\n borderRadius: '50%',\n border: 'none',\n background: isOpen ? 'rgba(59, 130, 246, 0.9)' : 'rgba(30, 30, 30, 0.85)',\n color: '#fff',\n cursor: btnDragging ? 'grabbing' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n transition: btnTransition\n ? 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), top 0.3s cubic-bezier(0.4, 0, 0.2, 1), background 0.15s'\n : 'background 0.15s',\n touchAction: 'none',\n userSelect: 'none',\n ...buttonStyle,\n }\n\n const tooltipStyle: React.CSSProperties = {\n position: 'absolute',\n whiteSpace: 'nowrap',\n fontSize: 11,\n fontWeight: 500,\n padding: '4px 10px',\n borderRadius: 6,\n background: 'rgba(15, 15, 20, 0.95)',\n color: '#ccc',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n pointerEvents: 'none',\n ...(isBottom\n ? { bottom: '100%', marginBottom: 8 }\n : { top: '100%', marginTop: 8 }),\n ...(isLeft\n ? { left: 0 }\n : { right: 0 }),\n }\n\n const cardStyle: React.CSSProperties = {\n position: 'fixed',\n left: cardPos?.x ?? 0,\n top: cardPos?.y ?? 0,\n zIndex: 99999,\n width: cardSize.w,\n height: cardSize.h,\n background: 'rgba(20, 20, 24, 0.95)',\n backdropFilter: 'blur(12px)',\n border: '1px solid rgba(255,255,255,0.1)',\n borderRadius: 10,\n color: '#e0e0e0',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 12,\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 8px 32px rgba(0,0,0,0.5)',\n overflow: 'hidden',\n ...panelStyle,\n }\n\n const titleBarStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n gap: 8,\n background: 'rgba(255,255,255,0.04)',\n borderBottom: '1px solid rgba(255,255,255,0.08)',\n cursor: 'grab',\n userSelect: 'none',\n flexShrink: 0,\n touchAction: 'none',\n }\n\n const titleTextStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.03em',\n opacity: 0.8,\n flexShrink: 0,\n }\n\n const titleBtnStyle = (active?: boolean): React.CSSProperties => ({\n height: 22,\n padding: '0 8px',\n borderRadius: 4,\n border: '1px solid ' + (active ? 'rgba(59,130,246,0.5)' : 'rgba(128,128,128,0.25)'),\n background: active ? 'rgba(59,130,246,0.15)' : 'transparent',\n color: active ? '#93b8f7' : '#999',\n cursor: 'pointer',\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: '0.02em',\n flexShrink: 0,\n })\n\n const closeBtnStyle: React.CSSProperties = {\n width: 20,\n height: 20,\n borderRadius: 4,\n border: 'none',\n background: 'transparent',\n color: '#999',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 14,\n lineHeight: '1',\n padding: 0,\n flexShrink: 0,\n }\n\n const bodyStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'row',\n overflow: 'hidden',\n minHeight: 0,\n }\n\n const mainColumnStyle: React.CSSProperties = {\n flex: showDiff ? '0 0 50%' : '1 1 100%',\n overflow: 'auto',\n padding: '10px 12px',\n minWidth: 0,\n }\n\n const diffColumnStyle: React.CSSProperties = {\n flex: '0 0 50%',\n overflow: 'auto',\n padding: '10px 12px',\n borderLeft: '1px solid rgba(255,255,255,0.08)',\n minWidth: 0,\n }\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: 8,\n }\n\n const headingStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n opacity: 0.6,\n marginBottom: 6,\n }\n\n const statRowStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n fontSize: 12,\n padding: '2px 0',\n }\n\n const statValueStyle: React.CSSProperties = {\n fontFamily: 'monospace',\n fontSize: 11,\n opacity: 0.8,\n }\n\n const badgeStyle = (color: string): React.CSSProperties => ({\n display: 'inline-block',\n fontSize: 9,\n fontWeight: 700,\n fontFamily: 'monospace',\n padding: '1px 5px',\n borderRadius: 3,\n backgroundColor: color + '22',\n color,\n marginRight: 6,\n flexShrink: 0,\n })\n\n const eventListStyle: React.CSSProperties = {\n maxHeight: 160,\n overflowY: 'auto',\n fontSize: 11,\n lineHeight: '1.6',\n }\n\n const eventItemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 4,\n padding: '2px 0',\n borderBottom: '1px solid rgba(128,128,128,0.1)',\n }\n\n const timeStyle: React.CSSProperties = {\n fontFamily: 'monospace',\n fontSize: 10,\n opacity: 0.4,\n flexShrink: 0,\n minWidth: 52,\n }\n\n const clearBtnStyle: React.CSSProperties = {\n fontSize: 10,\n padding: '2px 8px',\n border: '1px solid rgba(128,128,128,0.3)',\n borderRadius: 4,\n background: 'transparent',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n }\n\n // Resize edge styles\n const EDGE_SIZE = 6\n const resizeEdge = (edge: string): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: 'absolute',\n zIndex: 1,\n }\n const cursors: Record<string, string> = {\n n: 'ns-resize', s: 'ns-resize', e: 'ew-resize', w: 'ew-resize',\n ne: 'nesw-resize', nw: 'nwse-resize', se: 'nwse-resize', sw: 'nesw-resize',\n }\n const styles: Record<string, React.CSSProperties> = {\n n: { top: 0, left: EDGE_SIZE, right: EDGE_SIZE, height: EDGE_SIZE },\n s: { bottom: 0, left: EDGE_SIZE, right: EDGE_SIZE, height: EDGE_SIZE },\n e: { right: 0, top: EDGE_SIZE, bottom: EDGE_SIZE, width: EDGE_SIZE },\n w: { left: 0, top: EDGE_SIZE, bottom: EDGE_SIZE, width: EDGE_SIZE },\n ne: { top: 0, right: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n nw: { top: 0, left: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n se: { bottom: 0, right: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n sw: { bottom: 0, left: 0, width: EDGE_SIZE * 2, height: EDGE_SIZE * 2 },\n }\n return { ...base, cursor: cursors[edge], ...styles[edge] }\n }\n\n const EDGES = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw']\n\n // Diff row colors\n const diffRowColor = (ct: ChangeType): React.CSSProperties => {\n if (ct === 'added') return { background: 'rgba(16,185,129,0.1)', color: '#34d399' }\n if (ct === 'moved') return { background: 'rgba(245,158,11,0.1)', color: '#fbbf24' }\n return { color: 'rgba(200,200,200,0.5)' }\n }\n\n return (\n <>\n {/* Trigger Button + Tooltip */}\n <div style={{ position: 'fixed', left: btnPos.x, top: btnPos.y, zIndex: 99998 }}>\n <button\n onPointerDown={handleBtnPointerDown}\n onPointerMove={handleBtnPointerMove}\n onPointerUp={handleBtnPointerUp}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n style={triggerBtnStyle}\n aria-label={isOpen ? 'Close DevTools' : 'Open DevTools'}\n >\n <DevToolsLogo size={20} />\n </button>\n {showTooltip && !isOpen && !btnDragging && (\n <div style={tooltipStyle}>dnd-block-tree DevTools</div>\n )}\n </div>\n\n {/* Floating Card */}\n {isOpen && cardPos && (\n <div\n ref={cardRef}\n style={cardStyle}\n data-devtools-root=\"\"\n >\n {/* Resize handles */}\n {EDGES.map(edge => (\n <div\n key={edge}\n style={resizeEdge(edge)}\n onPointerDown={handleResizePointerDown(edge)}\n onPointerMove={handleResizePointerMove}\n onPointerUp={handleResizePointerUp}\n />\n ))}\n\n {/* Title Bar (drag handle) */}\n <div\n style={titleBarStyle}\n onPointerDown={handleDragPointerDown}\n onPointerMove={handleDragPointerMove}\n onPointerUp={handleDragPointerUp}\n >\n <span style={titleTextStyle}>DevTools</span>\n <div style={{ flex: 1 }} />\n <button\n onClick={toggleDiff}\n style={titleBtnStyle(showDiff)}\n onPointerDown={e => e.stopPropagation()}\n title=\"Toggle structure diff — shows which blocks were added, moved, or unchanged\"\n >\n Diff\n </button>\n <button\n onClick={toggle}\n style={closeBtnStyle}\n onPointerDown={e => e.stopPropagation()}\n aria-label=\"Close DevTools\"\n >\n ×\n </button>\n </div>\n\n {/* Body */}\n <div style={bodyStyle}>\n {/* Main column */}\n <div style={mainColumnStyle}>\n {/* Tree State */}\n <div style={sectionStyle} data-devtools-section=\"tree-state\">\n <div style={headingStyle} title=\"Live snapshot of the block tree structure\">Tree State</div>\n <div style={statRowStyle} title=\"Total number of blocks in the flat array\">\n <span>Blocks</span>\n <span style={statValueStyle}>{treeStats.blockCount}</span>\n </div>\n <div style={statRowStyle} title=\"Blocks whose type is in containerTypes (can have children)\">\n <span>Containers</span>\n <span style={statValueStyle}>{treeStats.containerCount}</span>\n </div>\n <div style={statRowStyle} title=\"Deepest nesting level in the tree (root = 1)\">\n <span>Max Depth</span>\n <span style={statValueStyle}>{treeStats.maxDepth}</span>\n </div>\n <div style={statRowStyle} title=\"Checks for cycles, orphans, and stale parent refs\">\n <span>Validation</span>\n <span style={{\n ...statValueStyle,\n color: treeStats.validation.valid ? '#10b981' : '#ef4444',\n }}>\n {treeStats.validation.valid ? 'Valid' : `${treeStats.validation.issues.length} issue(s)`}\n </span>\n </div>\n {!treeStats.validation.valid && (\n <div style={{ fontSize: 10, color: '#ef4444', marginTop: 4 }}>\n {treeStats.validation.issues.map((issue, i) => (\n <div key={i}>{issue}</div>\n ))}\n </div>\n )}\n </div>\n\n {/* Event Log */}\n <div style={sectionStyle} data-devtools-section=\"event-log\">\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6 }}>\n <div style={headingStyle} title=\"Chronological log of drag, drop, move, expand, and hover events\">Event Log ({events.length})</div>\n {events.length > 0 && (\n <button onClick={onClearEvents} style={clearBtnStyle}>Clear</button>\n )}\n </div>\n <div style={eventListStyle}>\n {events.length === 0 ? (\n <div style={{ fontSize: 11, opacity: 0.4, padding: '8px 0' }}>\n No events yet. Drag some blocks!\n </div>\n ) : (\n events.map(event => (\n <div key={event.id} style={eventItemStyle}>\n <span style={timeStyle}>{formatTime(event.timestamp)}</span>\n <span style={badgeStyle(TYPE_COLORS[event.type])} title={TYPE_TOOLTIPS[event.type]}>{TYPE_LABELS[event.type]}</span>\n <span style={{ wordBreak: 'break-word' }}>{event.summary}</span>\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* Performance */}\n <div style={sectionStyle} data-devtools-section=\"performance\">\n <div style={headingStyle} title=\"Render metrics for the DevTools component itself\">Performance</div>\n <div style={statRowStyle} title=\"How many times this DevTools component has rendered\">\n <span>Render Count</span>\n <span style={statValueStyle}>{renderCountRef.current}</span>\n </div>\n <div style={statRowStyle} title=\"Time since the previous render of this component\">\n <span>Last Render</span>\n <span style={statValueStyle}>{renderTime.toFixed(1)}ms</span>\n </div>\n <div style={statRowStyle} title=\"Change in block count since the last render (+added / -removed)\">\n <span style={{\n ...statValueStyle,\n color: blockCountDelta > 0 ? '#10b981' : blockCountDelta < 0 ? '#ef4444' : undefined,\n }}>\n {blockCountDelta > 0 ? '+' : ''}{blockCountDelta}\n </span>\n </div>\n </div>\n </div>\n\n {/* Diff column */}\n {showDiff && (\n <div style={diffColumnStyle}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n <div style={headingStyle} title=\"Tree structure diff — compares current state to the previous render\">Structure</div>\n <div style={{ display: 'flex', gap: 10, fontSize: 11, fontWeight: 500 }}>\n {diffStats.added > 0 && (\n <span style={{ color: '#34d399', display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ width: 5, height: 5, borderRadius: '50%', background: '#34d399', display: 'inline-block' }} />\n {diffStats.added} new\n </span>\n )}\n {diffStats.moved > 0 && (\n <span style={{ color: '#fbbf24', display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ width: 5, height: 5, borderRadius: '50%', background: '#fbbf24', display: 'inline-block' }} />\n {diffStats.moved} moved\n </span>\n )}\n {diffStats.added === 0 && diffStats.moved === 0 && (\n <span style={{ opacity: 0.4 }}>No changes</span>\n )}\n </div>\n </div>\n <div style={{ fontFamily: 'monospace', fontSize: 11, lineHeight: '1.7' }}>\n {diffTree.map(({ block, changeType, depth }) => (\n <div\n key={block.id}\n style={{\n paddingLeft: depth * 14,\n padding: '2px 6px 2px ' + (depth * 14 + 6) + 'px',\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n ...diffRowColor(changeType),\n }}\n >\n <span style={{ width: 12, textAlign: 'center', fontWeight: 700, fontSize: 10 }}>\n {changeType === 'added' && '+'}\n {changeType === 'moved' && '~'}\n </span>\n <span style={{\n textTransform: 'uppercase',\n fontSize: 9,\n letterSpacing: '0.05em',\n width: 50,\n flexShrink: 0,\n opacity: changeType === 'unchanged' ? 0.5 : 1,\n }}>\n {block.type}\n </span>\n <span style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n }}>\n {getLabel(block)}\n </span>\n <span style={{\n fontFamily: 'monospace',\n fontSize: 10,\n flexShrink: 0,\n padding: '1px 5px',\n borderRadius: 3,\n ...(changeType === 'added'\n ? { background: 'rgba(16,185,129,0.2)', color: '#34d399' }\n : changeType === 'moved'\n ? { background: 'rgba(245,158,11,0.2)', color: '#fbbf24' }\n : { background: 'rgba(128,128,128,0.15)', color: 'rgba(200,200,200,0.4)' }),\n }}>\n {String(block.order)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n","import type { BaseBlock } from '../core/types'\n\n/**\n * A nested/tree representation of a block.\n * Omits `parentId` and `order` since they are reconstructed during flattening.\n */\nexport type NestedBlock<T extends BaseBlock> = Omit<T, 'parentId' | 'order'> & {\n children: NestedBlock<T>[]\n}\n\n/**\n * Convert a flat block array into a nested tree structure.\n * Groups blocks by parentId, sorts siblings by order, and recursively builds children arrays.\n */\nexport function flatToNested<T extends BaseBlock>(blocks: T[]): NestedBlock<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 if (list) {\n list.push(block)\n } else {\n byParent.set(key, [block])\n }\n }\n\n // Sort each group by order\n for (const list of byParent.values()) {\n list.sort((a, b) => {\n if (typeof a.order === 'string' && typeof b.order === 'string') {\n return a.order < b.order ? -1 : a.order > b.order ? 1 : 0\n }\n return Number(a.order) - Number(b.order)\n })\n }\n\n function buildChildren(parentId: string | null): NestedBlock<T>[] {\n const siblings = byParent.get(parentId) ?? []\n return siblings.map(block => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { parentId: _p, order: _o, ...rest } = block\n return {\n ...rest,\n children: buildChildren(block.id),\n } as NestedBlock<T>\n })\n }\n\n return buildChildren(null)\n}\n\n/**\n * Convert a nested tree structure back to a flat block array.\n * DFS walk assigning parentId and integer order on the way down.\n */\nexport function nestedToFlat<T extends BaseBlock>(nested: NestedBlock<T>[]): T[] {\n const result: T[] = []\n\n function walk(nodes: NestedBlock<T>[], parentId: string | null) {\n for (let i = 0; i < nodes.length; i++) {\n const { children, ...rest } = nodes[i]\n result.push({\n ...rest,\n parentId,\n order: i,\n } as unknown as T)\n walk(children, (rest as { id: string }).id)\n }\n }\n\n walk(nested, null)\n return result\n}\n"]}