@dnd-block-tree/vanilla 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1030,5 +1030,3 @@ exports.renderTree = renderTree;
1030
1030
  exports.setDataAttributes = setDataAttributes;
1031
1031
  exports.setDropZoneActive = setDropZoneActive;
1032
1032
  exports.triggerHaptic = triggerHaptic;
1033
- //# sourceMappingURL=index.js.map
1034
- //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -884,5 +884,3 @@ function createDisposable() {
884
884
  }
885
885
 
886
886
  export { DragOverlay, KeyboardSensor, LayoutAnimation, PointerSensor, TouchSensor, VirtualScroller, buildCandidates, closestWithData, createBlockHistory, createBlockTreeController, createDefaultRenderer, createDisposable, createDropZoneElement, createElement, createGhostPreview, detectCollision, measureDropZoneRects, pointerToRect, renderTree, setDataAttributes, setDropZoneActive, triggerHaptic };
887
- //# sourceMappingURL=index.mjs.map
888
- //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dnd-block-tree/vanilla",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Vanilla JS/TS adapter for dnd-block-tree — zero framework dependencies",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -17,7 +17,9 @@
17
17
  }
18
18
  }
19
19
  },
20
- "files": ["dist"],
20
+ "files": [
21
+ "dist"
22
+ ],
21
23
  "scripts": {
22
24
  "build": "tsup",
23
25
  "dev": "tsup --watch",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/collision-bridge.ts","../src/drag-overlay.ts","../src/utils/dom.ts","../src/sensors/pointer-sensor.ts","../src/utils/haptic.ts","../src/sensors/touch-sensor.ts","../src/sensors/keyboard-sensor.ts","../src/history.ts","../src/controller.ts","../src/layout-animation.ts","../src/virtual-scroller.ts","../src/renderer/drop-zone.ts","../src/renderer/tree-renderer.ts","../src/renderer/default-renderer.ts","../src/renderer/ghost-preview.ts","../src/utils/disposable.ts"],"names":["historyReducer","createStickyCollision","createBlockTree","EventEmitter","getBlockDepth"],"mappings":"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","file":"index.js","sourcesContent":["import type { Rect, CollisionCandidate, CoreCollisionDetection } from '@dnd-block-tree/core'\n\n/**\n * Measure DOM rects for all registered drop zones and build CollisionCandidate[].\n * Snapshots rects once at drag start to prevent feedback loops.\n */\nexport function measureDropZoneRects(\n zones: Map<string, HTMLElement>\n): Map<string, Rect> {\n const rects = new Map<string, Rect>()\n for (const [id, el] of zones) {\n const domRect = el.getBoundingClientRect()\n rects.set(id, {\n top: domRect.top,\n left: domRect.left,\n width: domRect.width,\n height: domRect.height,\n right: domRect.right,\n bottom: domRect.bottom,\n })\n }\n return rects\n}\n\n/** Build collision candidates from a snapshot rect map */\nexport function buildCandidates(\n snapshotRects: Map<string, Rect>\n): CollisionCandidate[] {\n const candidates: CollisionCandidate[] = []\n for (const [id, rect] of snapshotRects) {\n candidates.push({ id, rect })\n }\n return candidates\n}\n\n/** Build a pointer rect from client coordinates */\nexport function pointerToRect(x: number, y: number): Rect {\n return {\n top: y,\n left: x,\n width: 1,\n height: 1,\n right: x + 1,\n bottom: y + 1,\n }\n}\n\n/** Run collision detection with snapshotted rects and pointer position */\nexport function detectCollision(\n detector: CoreCollisionDetection,\n snapshotRects: Map<string, Rect>,\n pointerX: number,\n pointerY: number\n): string | null {\n const candidates = buildCandidates(snapshotRects)\n const pointerRect = pointerToRect(pointerX, pointerY)\n const results = detector(candidates, pointerRect)\n return results.length > 0 ? results[0].id : null\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\n\nexport interface DragOverlayOptions {\n /** Custom renderer for the overlay content */\n renderOverlay?: (block: BaseBlock) => HTMLElement\n}\n\n/**\n * Floating drag overlay that follows the pointer during drag.\n * Creates and manages a fixed-position overlay element.\n */\nexport class DragOverlay {\n private overlay: HTMLElement | null = null\n private options: DragOverlayOptions\n\n constructor(options: DragOverlayOptions = {}) {\n this.options = options\n }\n\n show(block: BaseBlock, sourceEl: HTMLElement, x: number, y: number): void {\n this.hide()\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-drag-overlay', 'true')\n overlay.style.position = 'fixed'\n overlay.style.zIndex = '9999'\n overlay.style.pointerEvents = 'none'\n overlay.style.opacity = '0.7'\n overlay.style.backdropFilter = 'blur(4px)'\n overlay.style.willChange = 'transform'\n\n if (this.options.renderOverlay) {\n overlay.appendChild(this.options.renderOverlay(block))\n } else {\n // Default: clone the source element\n const rect = sourceEl.getBoundingClientRect()\n overlay.style.width = `${rect.width}px`\n const clone = sourceEl.cloneNode(true) as HTMLElement\n clone.style.margin = '0'\n overlay.appendChild(clone)\n }\n\n this.setPosition(overlay, x, y)\n document.body.appendChild(overlay)\n this.overlay = overlay\n }\n\n move(x: number, y: number): void {\n if (this.overlay) {\n this.setPosition(this.overlay, x, y)\n }\n }\n\n hide(): void {\n if (this.overlay) {\n this.overlay.remove()\n this.overlay = null\n }\n }\n\n private setPosition(el: HTMLElement, x: number, y: number): void {\n el.style.transform = `translate(${x}px, ${y}px)`\n }\n}\n","/** Create an element with attributes and optional children */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs?: Record<string, string>,\n children?: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n el.setAttribute(key, value)\n }\n }\n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n el.appendChild(document.createTextNode(child))\n } else {\n el.appendChild(child)\n }\n }\n }\n return el\n}\n\n/** Set data attributes from an object */\nexport function setDataAttributes(el: HTMLElement, data: Record<string, string | boolean | number>): void {\n for (const [key, value] of Object.entries(data)) {\n if (value === false) {\n el.removeAttribute(`data-${key}`)\n } else {\n el.setAttribute(`data-${key}`, String(value))\n }\n }\n}\n\n/** Find the closest ancestor with a given data attribute */\nexport function closestWithData(el: Element, dataAttr: string): HTMLElement | null {\n return el.closest(`[data-${dataAttr}]`) as HTMLElement | null\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\n\nexport interface PointerSensorOptions {\n activationDistance?: number\n}\n\nexport class PointerSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private activationDistance: number\n private isDragging = false\n private startX = 0\n private startY = 0\n private blockId: string | null = null\n\n private boundPointerDown: (e: PointerEvent) => void\n private boundPointerMove: (e: PointerEvent) => void\n private boundPointerUp: (e: PointerEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: PointerSensorOptions = {}) {\n this.callbacks = callbacks\n this.activationDistance = options.activationDistance ?? 8\n\n this.boundPointerDown = this.onPointerDown.bind(this)\n this.boundPointerMove = this.onPointerMove.bind(this)\n this.boundPointerUp = this.onPointerUp.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('pointerdown', this.boundPointerDown)\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('pointerdown', this.boundPointerDown)\n this.container = null\n }\n\n private onPointerDown(e: PointerEvent): void {\n // Only primary button\n if (e.button !== 0) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n this.startX = e.clientX\n this.startY = e.clientY\n this.isDragging = false\n\n document.addEventListener('pointermove', this.boundPointerMove)\n document.addEventListener('pointerup', this.boundPointerUp)\n }\n\n private onPointerMove(e: PointerEvent): void {\n const dx = e.clientX - this.startX\n const dy = e.clientY - this.startY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (!this.isDragging) {\n if (distance >= this.activationDistance) {\n this.isDragging = true\n this.callbacks.onDragStart(this.blockId!, this.startX, this.startY)\n }\n return\n }\n\n this.callbacks.onDragMove(e.clientX, e.clientY)\n }\n\n private onPointerUp(e: PointerEvent): void {\n if (this.isDragging) {\n this.callbacks.onDragEnd(e.clientX, e.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('pointermove', this.boundPointerMove)\n document.removeEventListener('pointerup', this.boundPointerUp)\n }\n}\n","/**\n * Trigger haptic feedback (vibration) on supported devices.\n * Safe to call in any environment -- no-ops when `navigator.vibrate` is unavailable.\n */\nexport function triggerHaptic(durationMs = 10): void {\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') {\n navigator.vibrate(durationMs)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\nimport { triggerHaptic } from '../utils/haptic'\n\nexport interface TouchSensorOptions {\n longPressDelay?: number\n hapticFeedback?: boolean\n}\n\nexport class TouchSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private longPressDelay: number\n private hapticFeedback: boolean\n private isDragging = false\n private pressTimer: ReturnType<typeof setTimeout> | null = null\n private blockId: string | null = null\n\n private boundTouchStart: (e: TouchEvent) => void\n private boundTouchMove: (e: TouchEvent) => void\n private boundTouchEnd: (e: TouchEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: TouchSensorOptions = {}) {\n this.callbacks = callbacks\n this.longPressDelay = options.longPressDelay ?? 200\n this.hapticFeedback = options.hapticFeedback ?? true\n\n this.boundTouchStart = this.onTouchStart.bind(this)\n this.boundTouchMove = this.onTouchMove.bind(this)\n this.boundTouchEnd = this.onTouchEnd.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('touchstart', this.boundTouchStart, { passive: false })\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('touchstart', this.boundTouchStart)\n this.container = null\n }\n\n private onTouchStart(e: TouchEvent): void {\n if (e.touches.length !== 1) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n const touch = e.touches[0]\n\n this.pressTimer = setTimeout(() => {\n this.isDragging = true\n if (this.hapticFeedback) triggerHaptic()\n this.callbacks.onDragStart(this.blockId!, touch.clientX, touch.clientY)\n }, this.longPressDelay)\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false })\n document.addEventListener('touchend', this.boundTouchEnd)\n document.addEventListener('touchcancel', this.boundTouchEnd)\n }\n\n private onTouchMove(e: TouchEvent): void {\n const touch = e.touches[0]\n\n if (!this.isDragging) {\n // Cancel long-press if finger moved before activation\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n this.cleanup()\n }\n return\n }\n\n e.preventDefault()\n this.callbacks.onDragMove(touch.clientX, touch.clientY)\n }\n\n private onTouchEnd(e: TouchEvent): void {\n if (this.isDragging) {\n const touch = e.changedTouches[0]\n this.callbacks.onDragEnd(touch.clientX, touch.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n }\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('touchmove', this.boundTouchMove)\n document.removeEventListener('touchend', this.boundTouchEnd)\n document.removeEventListener('touchcancel', this.boundTouchEnd)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\n\nexport interface KeyboardSensorCallbacks extends SensorCallbacks {\n onFocusPrev(): void\n onFocusNext(): void\n onExpand(): void\n onCollapse(): void\n onFocusFirst(): void\n onFocusLast(): void\n onToggleExpand(): void\n onSelect(): void\n}\n\nexport class KeyboardSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: KeyboardSensorCallbacks\n private boundKeyDown: (e: KeyboardEvent) => void\n\n constructor(callbacks: KeyboardSensorCallbacks) {\n this.callbacks = callbacks\n this.boundKeyDown = this.onKeyDown.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('keydown', this.boundKeyDown)\n }\n\n detach(): void {\n this.container?.removeEventListener('keydown', this.boundKeyDown)\n this.container = null\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n this.callbacks.onFocusPrev()\n break\n case 'ArrowDown':\n e.preventDefault()\n this.callbacks.onFocusNext()\n break\n case 'ArrowRight':\n e.preventDefault()\n this.callbacks.onExpand()\n break\n case 'ArrowLeft':\n e.preventDefault()\n this.callbacks.onCollapse()\n break\n case 'Home':\n e.preventDefault()\n this.callbacks.onFocusFirst()\n break\n case 'End':\n e.preventDefault()\n this.callbacks.onFocusLast()\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n this.callbacks.onToggleExpand()\n break\n case 'Escape':\n this.callbacks.onDragCancel()\n break\n }\n }\n}\n","import type { BaseBlock, HistoryState, HistoryAction } from '@dnd-block-tree/core'\nimport { historyReducer } from '@dnd-block-tree/core'\n\nexport interface BlockHistoryOptions {\n maxSteps?: number\n}\n\nexport interface BlockHistory<T extends BaseBlock> {\n push(blocks: T[]): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n getPresent(): T[]\n clear(blocks: T[]): void\n}\n\n/**\n * Imperative undo/redo history wrapping core's historyReducer.\n */\nexport function createBlockHistory<T extends BaseBlock>(\n initialBlocks: T[],\n options: BlockHistoryOptions = {}\n): BlockHistory<T> {\n const { maxSteps = 50 } = options\n\n let state: HistoryState<T> = {\n past: [],\n present: initialBlocks,\n future: [],\n }\n\n return {\n push(blocks: T[]) {\n state = historyReducer(state, { type: 'SET', payload: blocks, maxSteps })\n },\n\n undo(): T[] | null {\n if (state.past.length === 0) return null\n state = historyReducer(state, { type: 'UNDO' })\n return state.present\n },\n\n redo(): T[] | null {\n if (state.future.length === 0) return null\n state = historyReducer(state, { type: 'REDO' })\n return state.present\n },\n\n canUndo: () => state.past.length > 0,\n canRedo: () => state.future.length > 0,\n getPresent: () => state.present,\n\n clear(blocks: T[]) {\n state = { past: [], present: blocks, future: [] }\n },\n }\n}\n","import type {\n BaseBlock,\n BlockTreeInstance,\n CoreCollisionDetection,\n Rect,\n} from '@dnd-block-tree/core'\nimport {\n createBlockTree,\n createStickyCollision,\n EventEmitter,\n} from '@dnd-block-tree/core'\nimport type {\n BlockTreeControllerOptions,\n ControllerEvents,\n DragState,\n Unsubscribe,\n VanillaSensorConfig,\n} from './types'\nimport { measureDropZoneRects, detectCollision } from './collision-bridge'\nimport { DragOverlay } from './drag-overlay'\nimport { PointerSensor } from './sensors/pointer-sensor'\nimport { TouchSensor } from './sensors/touch-sensor'\nimport { KeyboardSensor } from './sensors/keyboard-sensor'\nimport type { SensorCallbacks } from './sensors/types'\nimport type { Sensor } from './sensors/types'\nimport { createBlockHistory, type BlockHistory } from './history'\n\nexport interface BlockTreeController<T extends BaseBlock = BaseBlock> {\n // Mounting\n mount(container: HTMLElement): void\n unmount(): void\n\n // Registration\n registerDraggable(id: string, element: HTMLElement): Unsubscribe\n registerDropZone(id: string, element: HTMLElement): Unsubscribe\n\n // State reads\n getDragState(): DragState\n getBlocks(): T[]\n getEffectiveBlocks(): T[]\n getExpandedMap(): Record<string, boolean>\n getBlock(id: string): T | undefined\n\n // Actions\n toggleExpand(id: string): void\n setExpandAll(expanded: boolean): void\n addBlock(type: T['type'], parentId?: string | null): T\n deleteBlock(id: string): void\n setBlocks(blocks: T[]): void\n\n // Selection\n select(id: string, mode: 'single' | 'toggle' | 'range'): void\n clearSelection(): void\n getSelectedIds(): Set<string>\n\n // History (opt-in)\n enableHistory(maxSteps?: number): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n\n // Events\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe\n\n // Overlay\n setOverlayRenderer(render: (block: T) => HTMLElement): void\n\n // Tree instance (escape hatch)\n getTree(): BlockTreeInstance<T>\n\n // Cleanup\n destroy(): void\n}\n\nexport function createBlockTreeController<T extends BaseBlock>(\n options: BlockTreeControllerOptions<T> = {}\n): BlockTreeController<T> {\n const {\n initialBlocks = [],\n containerTypes = [],\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n sensors: sensorConfig,\n onChange,\n callbacks,\n } = options\n\n // Core tree instance\n const stickyCollision = createStickyCollision(15)\n const tree = createBlockTree<T>({\n initialBlocks,\n containerTypes,\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n collisionDetection: stickyCollision,\n })\n\n // Emitter for controller-level events\n const emitter = new EventEmitter<ControllerEvents<T>>()\n\n // DOM state\n let container: HTMLElement | null = null\n const draggableElements = new Map<string, HTMLElement>()\n const dropZoneElements = new Map<string, HTMLElement>()\n let snapshotRects: Map<string, Rect> | null = null\n\n // Selection state\n const selectedIds = new Set<string>()\n let lastSelectedId: string | null = null\n\n // Sensors\n const activeSensors: Sensor[] = []\n\n // Overlay\n const overlay = new DragOverlay()\n let overlayRenderer: ((block: T) => HTMLElement) | null = null\n\n // History (opt-in)\n let history: BlockHistory<T> | null = null\n\n // Wire core tree events to callbacks and controller emitter\n tree.on('blocks:change', (blocks) => {\n onChange?.(blocks as T[])\n if (history) {\n history.push(blocks as T[])\n }\n emitter.emit('render', blocks as T[], tree.getExpandedMap())\n })\n tree.on('expand:change', () => {\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n })\n if (callbacks?.onDragStart) {\n tree.on('drag:start', (e) => callbacks.onDragStart!(e as any))\n }\n if (callbacks?.onDragEnd) {\n tree.on('drag:end', (e) => callbacks.onDragEnd!(e as any))\n }\n if (callbacks?.onBlockAdd) {\n tree.on('block:add', (e) => callbacks.onBlockAdd!(e as any))\n }\n if (callbacks?.onBlockDelete) {\n tree.on('block:delete', (e) => callbacks.onBlockDelete!(e as any))\n }\n if (callbacks?.onExpandChange) {\n tree.on('expand:change', (e) => callbacks.onExpandChange!(e as any))\n }\n if (callbacks?.onHoverChange) {\n tree.on('hover:change', (e) => callbacks.onHoverChange!(e as any))\n }\n\n // Sensor callbacks\n const sensorCallbacks: SensorCallbacks = {\n onDragStart(blockId: string, x: number, y: number) {\n const draggedIds = selectedIds.has(blockId) && selectedIds.size > 1\n ? [...selectedIds]\n : [blockId]\n\n const started = tree.startDrag(blockId, draggedIds)\n if (!started) return\n\n stickyCollision.reset()\n snapshotRects = measureDropZoneRects(dropZoneElements)\n\n // Show overlay\n const block = tree.getBlock(blockId)\n const el = draggableElements.get(blockId)\n if (block && el) {\n if (overlayRenderer) {\n overlay.show(block, el, x, y)\n } else {\n overlay.show(block, el, x, y)\n }\n }\n\n emitter.emit('drag:statechange', getDragState())\n },\n\n onDragMove(x: number, y: number) {\n if (!snapshotRects) return\n\n overlay.move(x, y)\n\n const detector = tree.getCollisionDetection()\n if (!detector) return\n\n const targetZone = detectCollision(detector, snapshotRects, x, y)\n if (targetZone) {\n tree.updateDrag(targetZone)\n }\n },\n\n onDragEnd(_x: number, _y: number) {\n const result = tree.endDrag()\n overlay.hide()\n snapshotRects = null\n\n if (result && callbacks?.onBlockMove) {\n // Fire block move callback\n callbacks.onBlockMove({\n block: tree.getBlock(tree.getBlocks()[0]?.id) as any,\n from: { parentId: null, index: 0 },\n to: { parentId: null, index: 0 },\n blocks: result.blocks as T[],\n movedIds: [],\n })\n }\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n onDragCancel() {\n tree.cancelDrag()\n overlay.hide()\n snapshotRects = null\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n }\n\n function getDragState(): DragState {\n return {\n isDragging: tree.getActiveId() !== null,\n activeId: tree.getActiveId(),\n hoverZone: tree.getHoverZone(),\n }\n }\n\n function setupSensors(): void {\n const config: VanillaSensorConfig = sensorConfig ?? {}\n if (!container) return\n\n if (config.pointer !== false) {\n const pointer = new PointerSensor(sensorCallbacks, {\n activationDistance: config.activationDistance,\n })\n pointer.attach(container)\n activeSensors.push(pointer)\n }\n\n if (config.touch !== false) {\n const touch = new TouchSensor(sensorCallbacks, {\n longPressDelay: config.longPressDelay,\n hapticFeedback: config.hapticFeedback,\n })\n touch.attach(container)\n activeSensors.push(touch)\n }\n\n if (config.keyboard) {\n const visibleBlocks = () => tree.getEffectiveBlocks()\n let focusedIndex = -1\n\n const keyboard = new KeyboardSensor({\n ...sensorCallbacks,\n onFocusPrev() {\n const blocks = visibleBlocks()\n focusedIndex = Math.max(0, focusedIndex - 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onFocusNext() {\n const blocks = visibleBlocks()\n focusedIndex = Math.min(blocks.length - 1, focusedIndex + 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && !tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onCollapse() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onFocusFirst() {\n focusedIndex = 0\n const blocks = visibleBlocks()\n if (blocks[0]) focusDraggable(blocks[0].id)\n },\n onFocusLast() {\n const blocks = visibleBlocks()\n focusedIndex = blocks.length - 1\n if (blocks[focusedIndex]) focusDraggable(blocks[focusedIndex].id)\n },\n onToggleExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type)) {\n tree.toggleExpand(block.id)\n }\n },\n onSelect() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block) {\n controller.select(block.id, 'toggle')\n }\n },\n })\n keyboard.attach(container)\n activeSensors.push(keyboard)\n }\n }\n\n function focusDraggable(id: string): void {\n const el = draggableElements.get(id)\n if (el) el.focus()\n }\n\n function teardownSensors(): void {\n for (const sensor of activeSensors) {\n sensor.detach()\n }\n activeSensors.length = 0\n }\n\n const controller: BlockTreeController<T> = {\n mount(el: HTMLElement) {\n container = el\n setupSensors()\n // Initial render\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n unmount() {\n teardownSensors()\n overlay.hide()\n container = null\n },\n\n registerDraggable(id: string, element: HTMLElement) {\n element.setAttribute('data-draggable-id', id)\n element.setAttribute('data-block-id', id)\n draggableElements.set(id, element)\n return () => {\n draggableElements.delete(id)\n }\n },\n\n registerDropZone(id: string, element: HTMLElement) {\n element.setAttribute('data-zone-id', id)\n dropZoneElements.set(id, element)\n return () => {\n dropZoneElements.delete(id)\n }\n },\n\n getDragState,\n getBlocks: () => tree.getBlocks(),\n getEffectiveBlocks: () => tree.getEffectiveBlocks(),\n getExpandedMap: () => tree.getExpandedMap(),\n getBlock: (id) => tree.getBlock(id),\n\n toggleExpand(id: string) {\n tree.toggleExpand(id)\n },\n\n setExpandAll(expanded: boolean) {\n tree.setExpandAll(expanded)\n },\n\n addBlock(type, parentId = null) {\n return tree.addBlock(type, parentId)\n },\n\n deleteBlock(id: string) {\n tree.deleteBlock(id)\n },\n\n setBlocks(blocks: T[]) {\n tree.setBlocks(blocks)\n },\n\n select(id: string, mode: 'single' | 'toggle' | 'range') {\n if (mode === 'single') {\n selectedIds.clear()\n selectedIds.add(id)\n } else if (mode === 'toggle') {\n if (selectedIds.has(id)) {\n selectedIds.delete(id)\n } else {\n selectedIds.add(id)\n }\n } else if (mode === 'range' && lastSelectedId) {\n const blocks = tree.getBlocks()\n const startIdx = blocks.findIndex(b => b.id === lastSelectedId)\n const endIdx = blocks.findIndex(b => b.id === id)\n if (startIdx !== -1 && endIdx !== -1) {\n const [from, to] = startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx]\n for (let i = from; i <= to; i++) {\n selectedIds.add(blocks[i].id)\n }\n }\n }\n lastSelectedId = id\n emitter.emit('selection:change', new Set(selectedIds))\n },\n\n clearSelection() {\n selectedIds.clear()\n lastSelectedId = null\n emitter.emit('selection:change', new Set())\n },\n\n getSelectedIds: () => new Set(selectedIds),\n\n enableHistory(maxSteps = 50) {\n history = createBlockHistory(tree.getBlocks(), { maxSteps })\n },\n\n undo() {\n if (!history) return null\n const blocks = history.undo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n redo() {\n if (!history) return null\n const blocks = history.redo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n canUndo: () => history?.canUndo() ?? false,\n canRedo: () => history?.canRedo() ?? false,\n\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe {\n return emitter.on(event, handler)\n },\n\n setOverlayRenderer(render: (block: T) => HTMLElement) {\n overlayRenderer = render\n },\n\n getTree: () => tree,\n\n destroy() {\n teardownSensors()\n overlay.hide()\n tree.destroy()\n emitter.removeAllListeners()\n draggableElements.clear()\n dropZoneElements.clear()\n selectedIds.clear()\n },\n }\n\n return controller\n}\n","import type { Rect } from '@dnd-block-tree/core'\n\nexport interface LayoutAnimationOptions {\n duration?: number\n easing?: string\n}\n\n/**\n * FLIP animation for block layout changes.\n * Records element positions before a DOM update, then animates from old to new.\n */\nexport class LayoutAnimation {\n private duration: number\n private easing: string\n private snapshots = new Map<string, DOMRect>()\n\n constructor(options: LayoutAnimationOptions = {}) {\n this.duration = options.duration ?? 200\n this.easing = options.easing ?? 'ease'\n }\n\n /** Record current positions of all block elements in a container */\n snapshot(container: HTMLElement): void {\n this.snapshots.clear()\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (id) {\n this.snapshots.set(id, el.getBoundingClientRect())\n }\n }\n }\n\n /** After DOM update, animate elements from old to new positions */\n animate(container: HTMLElement): void {\n if (this.snapshots.size === 0) return\n\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (!id) continue\n\n const oldRect = this.snapshots.get(id)\n if (!oldRect) continue\n\n const newRect = el.getBoundingClientRect()\n\n const deltaX = oldRect.left - newRect.left\n const deltaY = oldRect.top - newRect.top\n\n if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) continue\n\n el.style.transform = `translate(${deltaX}px, ${deltaY}px)`\n el.style.transition = 'none'\n\n requestAnimationFrame(() => {\n el.style.transition = `transform ${this.duration}ms ${this.easing}`\n el.style.transform = ''\n\n const onEnd = () => {\n el.style.transition = ''\n el.removeEventListener('transitionend', onEnd)\n }\n el.addEventListener('transitionend', onEnd, { once: true })\n })\n }\n\n this.snapshots.clear()\n }\n}\n","export interface VirtualScrollerOptions {\n itemHeight: number\n overscan?: number\n}\n\nexport interface VirtualRange {\n startIndex: number\n endIndex: number\n offsetY: number\n totalHeight: number\n visibleIds: Set<string>\n}\n\n/**\n * Virtual scrolling for large trees.\n * Calculates visible range based on scroll position and viewport height.\n */\nexport class VirtualScroller {\n private itemHeight: number\n private overscan: number\n\n constructor(options: VirtualScrollerOptions) {\n this.itemHeight = options.itemHeight\n this.overscan = options.overscan ?? 5\n }\n\n /** Calculate the visible range for a given scroll state */\n calculate(\n scrollTop: number,\n viewportHeight: number,\n totalItems: number,\n blockIds: string[]\n ): VirtualRange {\n const startIndex = Math.max(0, Math.floor(scrollTop / this.itemHeight) - this.overscan)\n const visibleCount = Math.ceil(viewportHeight / this.itemHeight) + 2 * this.overscan\n const endIndex = Math.min(totalItems, startIndex + visibleCount)\n\n const visibleIds = new Set<string>()\n for (let i = startIndex; i < endIndex && i < blockIds.length; i++) {\n visibleIds.add(blockIds[i])\n }\n\n return {\n startIndex,\n endIndex,\n offsetY: startIndex * this.itemHeight,\n totalHeight: totalItems * this.itemHeight,\n visibleIds,\n }\n }\n}\n","import { createElement, setDataAttributes } from '../utils/dom'\n\nexport interface DropZoneOptions {\n id: string\n height?: number\n}\n\nexport function createDropZoneElement(options: DropZoneOptions): HTMLElement {\n const { id, height = 4 } = options\n const el = createElement('div')\n setDataAttributes(el, {\n 'zone-id': id,\n })\n el.style.height = `${height}px`\n el.style.minHeight = `${height}px`\n el.style.transition = 'background-color 150ms ease'\n return el\n}\n\nexport function setDropZoneActive(el: HTMLElement, active: boolean): void {\n setDataAttributes(el, { 'zone-active': active })\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport { getBlockDepth } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { RenderBlockContext } from '../types'\nimport { createElement, setDataAttributes } from '../utils/dom'\nimport { createDropZoneElement, setDropZoneActive } from './drop-zone'\n\nexport interface TreeRendererOptions<T extends BaseBlock> {\n renderBlock: (block: T, ctx: RenderBlockContext) => HTMLElement\n containerTypes: readonly string[]\n dropZoneHeight?: number\n}\n\n/**\n * Recursive DOM tree builder. Creates the full tree DOM from blocks.\n * Keyed by data-block-id for efficient reconciliation.\n */\nexport function renderTree<T extends BaseBlock>(\n blocks: T[],\n expandedMap: Record<string, boolean>,\n controller: BlockTreeController<T>,\n options: TreeRendererOptions<T>,\n parentId: string | null = null,\n depth = 0\n): HTMLElement {\n const { renderBlock, containerTypes, dropZoneHeight } = options\n\n const container = createElement('div', {\n role: parentId === null ? 'tree' : 'group',\n })\n if (parentId === null) {\n container.setAttribute('data-dnd-tree-root', 'true')\n }\n\n const children = blocks.filter(b => b.parentId === parentId)\n const activeId = controller.getDragState().activeId\n const selectedIds = controller.getSelectedIds()\n const index = controller.getTree().getBlockIndex()\n\n // Start zone for container\n if (parentId !== null) {\n const startZone = createDropZoneElement({ id: `into-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`into-${parentId}`, startZone)\n container.appendChild(startZone)\n } else {\n const rootStart = createDropZoneElement({ id: 'root-start', height: dropZoneHeight })\n controller.registerDropZone('root-start', rootStart)\n container.appendChild(rootStart)\n }\n\n for (const block of children) {\n // Skip actively dragged block (rendered in overlay)\n if (block.id === activeId) continue\n\n // Before zone\n const beforeZone = createDropZoneElement({ id: `before-${block.id}`, height: dropZoneHeight })\n controller.registerDropZone(`before-${block.id}`, beforeZone)\n container.appendChild(beforeZone)\n\n const isContainer = containerTypes.includes(block.type)\n const isExpanded = expandedMap[block.id] !== false\n const blockDepth = getBlockDepth(index, block.id)\n\n // Build children for containers\n let childrenEl: HTMLElement | null = null\n if (isContainer && isExpanded) {\n childrenEl = renderTree(blocks, expandedMap, controller, options, block.id, depth + 1)\n }\n\n const ctx: RenderBlockContext = {\n children: childrenEl,\n depth: blockDepth,\n isExpanded,\n isDragging: block.id === activeId,\n isSelected: selectedIds.has(block.id),\n onToggleExpand: isContainer ? () => controller.toggleExpand(block.id) : null,\n }\n\n const blockEl = renderBlock(block, ctx)\n setDataAttributes(blockEl, {\n 'block-id': block.id,\n 'block-type': block.type,\n depth: String(blockDepth),\n dragging: block.id === activeId,\n selected: selectedIds.has(block.id),\n })\n\n // Register as draggable\n controller.registerDraggable(block.id, blockEl)\n\n // ARIA attributes\n blockEl.setAttribute('role', 'treeitem')\n blockEl.setAttribute('aria-level', String(blockDepth + 1))\n if (isContainer) {\n blockEl.setAttribute('aria-expanded', String(isExpanded))\n }\n blockEl.setAttribute('tabindex', '-1')\n\n container.appendChild(blockEl)\n }\n\n // End zone\n if (parentId !== null) {\n const endZone = createDropZoneElement({ id: `end-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`end-${parentId}`, endZone)\n container.appendChild(endZone)\n } else {\n const rootEnd = createDropZoneElement({ id: 'root-end', height: dropZoneHeight })\n controller.registerDropZone('root-end', rootEnd)\n container.appendChild(rootEnd)\n }\n\n return container\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { DefaultRendererOptions, Unsubscribe, RenderBlockContext } from '../types'\nimport { renderTree } from './tree-renderer'\n\nexport interface DefaultRenderer extends Unsubscribe {\n /** Force a re-render */\n refresh(): void\n}\n\n/**\n * DefaultRenderer (Layer 2): Subscribes to controller events and\n * automatically creates/updates DOM. User provides a renderBlock function.\n */\nexport function createDefaultRenderer<T extends BaseBlock>(\n controller: BlockTreeController<T>,\n options: DefaultRendererOptions<T>\n): DefaultRenderer {\n const { container, renderBlock, dropZoneHeight, animateExpand } = options\n const containerTypes = (controller.getTree() as any).containerTypes ?? []\n\n function render(blocks: T[], expandedMap: Record<string, boolean>): void {\n // Clear existing DOM\n container.innerHTML = ''\n\n // Build fresh tree DOM\n const tree = renderTree(blocks, expandedMap, controller, {\n renderBlock,\n containerTypes,\n dropZoneHeight,\n })\n\n container.appendChild(tree)\n }\n\n // Subscribe to render events\n const unsubRender = controller.on('render', render)\n\n // Initial render\n render(controller.getBlocks(), controller.getExpandedMap())\n\n const renderer: DefaultRenderer = () => {\n unsubRender()\n }\n renderer.refresh = () => {\n render(controller.getBlocks(), controller.getExpandedMap())\n }\n\n return renderer\n}\n","import { setDataAttributes } from '../utils/dom'\n\n/** Create a semi-transparent in-flow preview of a block at its target position */\nexport function createGhostPreview(sourceEl: HTMLElement): HTMLElement {\n const ghost = sourceEl.cloneNode(true) as HTMLElement\n setDataAttributes(ghost, { 'dnd-ghost': 'true' })\n ghost.style.opacity = '0.3'\n ghost.style.pointerEvents = 'none'\n ghost.removeAttribute('data-draggable-id')\n ghost.removeAttribute('data-block-id')\n return ghost\n}\n","import type { Disposable } from '../types'\n\n/** Collect multiple cleanup functions into a single disposable */\nexport function createDisposable(): Disposable & { add(fn: () => void): void } {\n const cleanups: (() => void)[] = []\n\n return {\n add(fn: () => void) {\n cleanups.push(fn)\n },\n dispose() {\n for (const fn of cleanups.reverse()) {\n fn()\n }\n cleanups.length = 0\n },\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/collision-bridge.ts","../src/drag-overlay.ts","../src/utils/dom.ts","../src/sensors/pointer-sensor.ts","../src/utils/haptic.ts","../src/sensors/touch-sensor.ts","../src/sensors/keyboard-sensor.ts","../src/history.ts","../src/controller.ts","../src/layout-animation.ts","../src/virtual-scroller.ts","../src/renderer/drop-zone.ts","../src/renderer/tree-renderer.ts","../src/renderer/default-renderer.ts","../src/renderer/ghost-preview.ts","../src/utils/disposable.ts"],"names":[],"mappings":";;;;;;AAMO,SAAS,qBACd,KAAA,EACmB;AACnB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAkB;AACpC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,KAAA,EAAO;AAC5B,IAAA,MAAM,OAAA,GAAU,GAAG,qBAAA,EAAsB;AACzC,IAAA,KAAA,CAAM,IAAI,EAAA,EAAI;AAAA,MACZ,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,gBACd,aAAA,EACsB;AACtB,EAAA,MAAM,aAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,aAAA,EAAe;AACtC,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,UAAA;AACT;AAGO,SAAS,aAAA,CAAc,GAAW,CAAA,EAAiB;AACxD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,OAAO,CAAA,GAAI,CAAA;AAAA,IACX,QAAQ,CAAA,GAAI;AAAA,GACd;AACF;AAGO,SAAS,eAAA,CACd,QAAA,EACA,aAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,UAAA,GAAa,gBAAgB,aAAa,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,QAAA,EAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,UAAA,EAAY,WAAW,CAAA;AAChD,EAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,CAAC,EAAE,EAAA,GAAK,IAAA;AAC9C;;;AC/CO,IAAM,cAAN,MAAkB;AAAA,EAIvB,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAH9C,IAAA,IAAA,CAAQ,OAAA,GAA8B,IAAA;AAIpC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,IAAA,CAAK,KAAA,EAAkB,QAAA,EAAuB,CAAA,EAAW,CAAA,EAAiB;AACxE,IAAA,IAAA,CAAK,IAAA,EAAK;AAEV,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,YAAA,CAAa,qBAAqB,MAAM,CAAA;AAChD,IAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,OAAA;AACzB,IAAA,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AACvB,IAAA,OAAA,CAAQ,MAAM,aAAA,GAAgB,MAAA;AAC9B,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,KAAA;AACxB,IAAA,OAAA,CAAQ,MAAM,cAAA,GAAiB,WAAA;AAC/B,IAAA,OAAA,CAAQ,MAAM,UAAA,GAAa,WAAA;AAE3B,IAAA,IAAI,IAAA,CAAK,QAAQ,aAAA,EAAe;AAC9B,MAAA,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,IACvD,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,SAAS,qBAAA,EAAsB;AAC5C,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACrC,MAAA,KAAA,CAAM,MAAM,MAAA,GAAS,GAAA;AACrB,MAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAC9B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,IAAA,CAAK,GAAW,CAAA,EAAiB;AAC/B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AACpB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,EAAA,EAAiB,CAAA,EAAW,CAAA,EAAiB;AAC/D,IAAA,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,CAAA,UAAA,EAAa,CAAC,OAAO,CAAC,CAAA,GAAA,CAAA;AAAA,EAC7C;AACF;;;AC9DO,SAAS,aAAA,CACd,GAAA,EACA,KAAA,EACA,QAAA,EAC0B;AAC1B,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACrC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,EAAA,CAAG,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,EAAA,CAAG,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,YAAY,KAAK,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,iBAAA,CAAkB,IAAiB,IAAA,EAAuD;AACxG,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,EAAA,CAAG,eAAA,CAAgB,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,aAAa,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AACF;AAGO,SAAS,eAAA,CAAgB,IAAa,QAAA,EAAsC;AACjF,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA,CAAG,CAAA;AACxC;;;AC/BO,IAAM,gBAAN,MAAsC;AAAA,EAa3C,WAAA,CAAY,SAAA,EAA4B,OAAA,GAAgC,EAAC,EAAG;AAZ5E,IAAA,IAAA,CAAQ,SAAA,GAAgC,IAAA;AAGxC,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,IAAA,CAAQ,OAAA,GAAyB,IAAA;AAO/B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,CAAA;AAExD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,EAClD;AAAA,EAEA,OAAO,SAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,SAAA,CAAU,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA;AAAA,EACjE;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,SAAA,EAAW,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA;AACxE,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEQ,cAAc,CAAA,EAAuB;AAE3C,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAEpB,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,CAAA,CAAE,MAAA,EAAmB,cAAc,CAAA;AACrE,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,YAAA,CAAa,mBAAmB,CAAA;AACrD,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA;AAChB,IAAA,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAElB,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA;AAC9D,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAAA,EAC5D;AAAA,EAEQ,cAAc,CAAA,EAAuB;AAC3C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAA;AAC5B,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAE5C,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,IAAI,QAAA,IAAY,KAAK,kBAAA,EAAoB;AACvC,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,UAAU,WAAA,CAAY,IAAA,CAAK,SAAU,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MACpE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAAA,EAChD;AAAA,EAEQ,YAAY,CAAA,EAAuB;AACzC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAAA,IAC/C;AACA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA;AACjE,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAAA,EAC/D;AACF;;;ACpFO,SAAS,aAAA,CAAc,aAAa,EAAA,EAAU;AACnD,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,OAAO,SAAA,CAAU,YAAY,UAAA,EAAY;AAC/E,IAAA,SAAA,CAAU,QAAQ,UAAU,CAAA;AAAA,EAC9B;AACF;;;ACCO,IAAM,cAAN,MAAoC;AAAA,EAazC,WAAA,CAAY,SAAA,EAA4B,OAAA,GAA8B,EAAC,EAAG;AAZ1E,IAAA,IAAA,CAAQ,SAAA,GAAgC,IAAA;AAIxC,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,UAAA,GAAmD,IAAA;AAC3D,IAAA,IAAA,CAAQ,OAAA,GAAyB,IAAA;AAO/B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,GAAA;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,IAAA;AAEhD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EAChD;AAAA,EAEA,OAAO,SAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,SAAA,CAAU,iBAAiB,YAAA,EAAc,IAAA,CAAK,iBAAiB,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EACnF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,SAAA,EAAW,mBAAA,CAAoB,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA;AACtE,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEQ,aAAa,CAAA,EAAqB;AACxC,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,CAAA,CAAE,MAAA,EAAmB,cAAc,CAAA;AACrE,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,YAAA,CAAa,mBAAmB,CAAA;AACrD,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAEzB,IAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAI,IAAA,CAAK,gBAAgB,aAAA,EAAc;AACvC,MAAA,IAAA,CAAK,UAAU,WAAA,CAAY,IAAA,CAAK,SAAU,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,IACxE,CAAA,EAAG,KAAK,cAAc,CAAA;AAEtB,IAAA,QAAA,CAAS,iBAAiB,WAAA,EAAa,IAAA,CAAK,gBAAgB,EAAE,OAAA,EAAS,OAAO,CAAA;AAC9E,IAAA,QAAA,CAAS,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AACxD,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAAA,EAC7D;AAAA,EAEQ,YAAY,CAAA,EAAqB;AACvC,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAEzB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEpB,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AACA,MAAA;AAAA,IACF;AAEA,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,EACxD;AAAA,EAEQ,WAAW,CAAA,EAAqB;AACtC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,cAAA,CAAe,CAAC,CAAA;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,IACvD;AACA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAC7D,IAAA,QAAA,CAAS,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AAC3D,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAAA,EAChE;AACF;;;ACzFO,IAAM,iBAAN,MAAuC;AAAA,EAK5C,YAAY,SAAA,EAAoC;AAJhD,IAAA,IAAA,CAAQ,SAAA,GAAgC,IAAA;AAKtC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9C;AAAA,EAEA,OAAO,SAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA;AAAA,EACzD;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,SAAA,EAAW,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA;AAChE,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEQ,UAAU,CAAA,EAAwB;AACxC,IAAA,QAAQ,EAAE,GAAA;AAAK,MACb,KAAK,SAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,WAAA,EAAY;AAC3B,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,WAAA,EAAY;AAC3B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,QAAA,EAAS;AACxB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAC1B,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,YAAA,EAAa;AAC5B,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,WAAA,EAAY;AAC3B,QAAA;AAAA,MACF,KAAK,OAAA;AAAA,MACL,KAAK,GAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAU,cAAA,EAAe;AAC9B,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,UAAU,YAAA,EAAa;AAC5B,QAAA;AAAA;AACJ,EACF;AACF;ACjDO,SAAS,kBAAA,CACd,aAAA,EACA,OAAA,GAA+B,EAAC,EACf;AACjB,EAAA,MAAM,EAAE,QAAA,GAAW,EAAA,EAAG,GAAI,OAAA;AAE1B,EAAA,IAAI,KAAA,GAAyB;AAAA,IAC3B,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,QAAQ;AAAC,GACX;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,MAAA,EAAa;AAChB,MAAA,KAAA,GAAQ,cAAA,CAAe,OAAO,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,IAAA,GAAmB;AACjB,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpC,MAAA,KAAA,GAAQ,cAAA,CAAe,KAAA,EAAO,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf,CAAA;AAAA,IAEA,IAAA,GAAmB;AACjB,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACtC,MAAA,KAAA,GAAQ,cAAA,CAAe,KAAA,EAAO,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf,CAAA;AAAA,IAEA,OAAA,EAAS,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IACnC,OAAA,EAAS,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,IACrC,UAAA,EAAY,MAAM,KAAA,CAAM,OAAA;AAAA,IAExB,MAAM,MAAA,EAAa;AACjB,MAAA,KAAA,GAAQ,EAAE,MAAM,EAAC,EAAG,SAAS,MAAA,EAAQ,MAAA,EAAQ,EAAC,EAAE;AAAA,IAClD;AAAA,GACF;AACF;;;ACkBO,SAAS,yBAAA,CACd,OAAA,GAAyC,EAAC,EAClB;AACxB,EAAA,MAAM;AAAA,IACJ,gBAAgB,EAAC;AAAA,IACjB,iBAAiB,EAAC;AAAA,IAClB,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA,EAAS,YAAA;AAAA,IACT,QAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,eAAA,GAAkB,sBAAsB,EAAE,CAAA;AAChD,EAAA,MAAM,OAAO,eAAA,CAAmB;AAAA,IAC9B,aAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA,EAAoB;AAAA,GACrB,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAkC;AAGtD,EAAA,IAAI,SAAA,GAAgC,IAAA;AACpC,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAyB;AACvD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAyB;AACtD,EAAA,IAAI,aAAA,GAA0C,IAAA;AAG9C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,IAAI,cAAA,GAAgC,IAAA;AAGpC,EAAA,MAAM,gBAA0B,EAAC;AAGjC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,eAAA,GAAsD,IAAA;AAG1D,EAAA,IAAI,OAAA,GAAkC,IAAA;AAGtC,EAAA,IAAA,CAAK,EAAA,CAAG,eAAA,EAAiB,CAAC,MAAA,KAAW;AACnC,IAAA,QAAA,GAAW,MAAa,CAAA;AACxB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,MAAa,CAAA;AAAA,IAC5B;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAC7D,CAAC,CAAA;AACD,EAAA,IAAA,CAAK,EAAA,CAAG,iBAAiB,MAAM;AAC7B,IAAA,OAAA,CAAQ,KAAK,QAAA,EAAU,IAAA,CAAK,WAAU,EAAG,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAChE,CAAC,CAAA;AACD,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,IAAA,CAAK,GAAG,YAAA,EAAc,CAAC,MAAM,SAAA,CAAU,WAAA,CAAa,CAAQ,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,IAAA,CAAK,GAAG,UAAA,EAAY,CAAC,MAAM,SAAA,CAAU,SAAA,CAAW,CAAQ,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,IAAA,CAAK,GAAG,WAAA,EAAa,CAAC,MAAM,SAAA,CAAU,UAAA,CAAY,CAAQ,CAAC,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,IAAA,IAAA,CAAK,GAAG,cAAA,EAAgB,CAAC,MAAM,SAAA,CAAU,aAAA,CAAe,CAAQ,CAAC,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,IAAA,IAAA,CAAK,GAAG,eAAA,EAAiB,CAAC,MAAM,SAAA,CAAU,cAAA,CAAgB,CAAQ,CAAC,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,IAAA,IAAA,CAAK,GAAG,cAAA,EAAgB,CAAC,MAAM,SAAA,CAAU,aAAA,CAAe,CAAQ,CAAC,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,WAAA,CAAY,OAAA,EAAiB,CAAA,EAAW,CAAA,EAAW;AACjD,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,IAAK,WAAA,CAAY,IAAA,GAAO,CAAA,GAC9D,CAAC,GAAG,WAAW,CAAA,GACf,CAAC,OAAO,CAAA;AAEZ,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,UAAU,CAAA;AAClD,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAA,aAAA,GAAgB,qBAAqB,gBAAgB,CAAA;AAGrD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACnC,MAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA;AACxC,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QAC9B;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,YAAA,EAAc,CAAA;AAAA,IACjD,CAAA;AAAA,IAEA,UAAA,CAAW,GAAW,CAAA,EAAW;AAC/B,MAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAEjB,MAAA,MAAM,QAAA,GAAW,KAAK,qBAAA,EAAsB;AAC5C,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,QAAA,EAAU,aAAA,EAAe,GAAG,CAAC,CAAA;AAChE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,WAAW,UAAU,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,IAEA,SAAA,CAAU,IAAY,EAAA,EAAY;AAChC,MAAA,MAAM,MAAA,GAAS,KAAK,OAAA,EAAQ;AAC5B,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,aAAA,GAAgB,IAAA;AAEhB,MAAA,IAAI,MAAA,IAAU,WAAW,WAAA,EAAa;AAEpC,QAAA,SAAA,CAAU,WAAA,CAAY;AAAA,UACpB,KAAA,EAAO,KAAK,QAAA,CAAS,IAAA,CAAK,WAAU,CAAE,CAAC,GAAG,EAAE,CAAA;AAAA,UAC5C,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,UACjC,EAAA,EAAI,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,UAC/B,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,UAAU;AAAC,SACZ,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,YAAA,EAAc,CAAA;AAC/C,MAAA,OAAA,CAAQ,KAAK,QAAA,EAAU,IAAA,CAAK,WAAU,EAAG,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,YAAA,GAAe;AACb,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,aAAA,GAAgB,IAAA;AAEhB,MAAA,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,YAAA,EAAc,CAAA;AAC/C,MAAA,OAAA,CAAQ,KAAK,QAAA,EAAU,IAAA,CAAK,WAAU,EAAG,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAChE;AAAA,GACF;AAEA,EAAA,SAAS,YAAA,GAA0B;AACjC,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA;AAAA,MACnC,QAAA,EAAU,KAAK,WAAA,EAAY;AAAA,MAC3B,SAAA,EAAW,KAAK,YAAA;AAAa,KAC/B;AAAA,EACF;AAEA,EAAA,SAAS,YAAA,GAAqB;AAC5B,IAAA,MAAM,MAAA,GAA8B,gBAAgB,EAAC;AACrD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,eAAA,EAAiB;AAAA,QACjD,oBAAoB,MAAA,CAAO;AAAA,OAC5B,CAAA;AACD,MAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACxB,MAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC1B,MAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,eAAA,EAAiB;AAAA,QAC7C,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB,gBAAgB,MAAA,CAAO;AAAA,OACxB,CAAA;AACD,MAAA,KAAA,CAAM,OAAO,SAAS,CAAA;AACtB,MAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACpD,MAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,MAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe;AAAA,QAClC,GAAG,eAAA;AAAA,QACH,WAAA,GAAc;AACZ,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA;AAC3C,UAAA,MAAM,KAAA,GAAQ,OAAO,YAAY,CAAA;AACjC,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,KAAA,CAAM,EAAE,CAAA;AAAA,QACpC,CAAA;AAAA,QACA,WAAA,GAAc;AACZ,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,YAAA,GAAe,KAAK,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,eAAe,CAAC,CAAA;AAC3D,UAAA,MAAM,KAAA,GAAQ,OAAO,YAAY,CAAA;AACjC,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,KAAA,CAAM,EAAE,CAAA;AAAA,QACpC,CAAA;AAAA,QACA,QAAA,GAAW;AACT,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,MAAM,KAAA,GAAQ,OAAO,YAAY,CAAA;AACjC,UAAA,IAAI,KAAA,IAAS,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,EAAE,CAAA,EAAG;AAC9E,YAAA,IAAA,CAAK,YAAA,CAAa,MAAM,EAAE,CAAA;AAAA,UAC5B;AAAA,QACF,CAAA;AAAA,QACA,UAAA,GAAa;AACX,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,MAAM,KAAA,GAAQ,OAAO,YAAY,CAAA;AACjC,UAAA,IAAI,KAAA,IAAS,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,EAAE,CAAA,EAAG;AAC7E,YAAA,IAAA,CAAK,YAAA,CAAa,MAAM,EAAE,CAAA;AAAA,UAC5B;AAAA,QACF,CAAA;AAAA,QACA,YAAA,GAAe;AACb,UAAA,YAAA,GAAe,CAAA;AACf,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,IAAI,OAAO,CAAC,CAAA,iBAAkB,MAAA,CAAO,CAAC,EAAE,EAAE,CAAA;AAAA,QAC5C,CAAA;AAAA,QACA,WAAA,GAAc;AACZ,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,YAAA,GAAe,OAAO,MAAA,GAAS,CAAA;AAC/B,UAAA,IAAI,OAAO,YAAY,CAAA,iBAAkB,MAAA,CAAO,YAAY,EAAE,EAAE,CAAA;AAAA,QAClE,CAAA;AAAA,QACA,cAAA,GAAiB;AACf,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,MAAM,KAAA,GAAQ,OAAO,YAAY,CAAA;AACjC,UAAA,IAAI,KAAA,IAAS,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AAChD,YAAA,IAAA,CAAK,YAAA,CAAa,MAAM,EAAE,CAAA;AAAA,UAC5B;AAAA,QACF,CAAA;AAAA,QACA,QAAA,GAAW;AACT,UAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,UAAA,MAAM,KAAA,GAAQ,OAAO,YAAY,CAAA;AACjC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,QAAQ,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AACzB,MAAA,aAAA,CAAc,KAAK,QAAQ,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,SAAS,eAAe,EAAA,EAAkB;AACxC,IAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,EAAA,KAAO,KAAA,EAAM;AAAA,EACnB;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB;AACA,IAAA,aAAA,CAAc,MAAA,GAAS,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,MAAM,EAAA,EAAiB;AACrB,MAAA,SAAA,GAAY,EAAA;AACZ,MAAA,YAAA,EAAa;AAEb,MAAA,OAAA,CAAQ,KAAK,QAAA,EAAU,IAAA,CAAK,WAAU,EAAG,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,eAAA,EAAgB;AAChB,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,IAEA,iBAAA,CAAkB,IAAY,OAAA,EAAsB;AAClD,MAAA,OAAA,CAAQ,YAAA,CAAa,qBAAqB,EAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,YAAA,CAAa,iBAAiB,EAAE,CAAA;AACxC,MAAA,iBAAA,CAAkB,GAAA,CAAI,IAAI,OAAO,CAAA;AACjC,MAAA,OAAO,MAAM;AACX,QAAA,iBAAA,CAAkB,OAAO,EAAE,CAAA;AAAA,MAC7B,CAAA;AAAA,IACF,CAAA;AAAA,IAEA,gBAAA,CAAiB,IAAY,OAAA,EAAsB;AACjD,MAAA,OAAA,CAAQ,YAAA,CAAa,gBAAgB,EAAE,CAAA;AACvC,MAAA,gBAAA,CAAiB,GAAA,CAAI,IAAI,OAAO,CAAA;AAChC,MAAA,OAAO,MAAM;AACX,QAAA,gBAAA,CAAiB,OAAO,EAAE,CAAA;AAAA,MAC5B,CAAA;AAAA,IACF,CAAA;AAAA,IAEA,YAAA;AAAA,IACA,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA,EAAU;AAAA,IAChC,kBAAA,EAAoB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAAA,IAClD,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA,EAAe;AAAA,IAC1C,QAAA,EAAU,CAAC,EAAA,KAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,IAElC,aAAa,EAAA,EAAY;AACvB,MAAA,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,IACtB,CAAA;AAAA,IAEA,aAAa,QAAA,EAAmB;AAC9B,MAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,QAAA,CAAS,IAAA,EAAM,QAAA,GAAW,IAAA,EAAM;AAC9B,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,YAAY,EAAA,EAAY;AACtB,MAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,UAAU,MAAA,EAAa;AACrB,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,MAAA,CAAO,IAAY,IAAA,EAAqC;AACtD,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,WAAA,CAAY,KAAA,EAAM;AAClB,QAAA,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,IAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,UAAA,WAAA,CAAY,OAAO,EAAE,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,QACpB;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,KAAS,OAAA,IAAW,cAAA,EAAgB;AAC7C,QAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,QAAA,MAAM,WAAW,MAAA,CAAO,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,cAAc,CAAA;AAC9D,QAAA,MAAM,SAAS,MAAA,CAAO,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AAChD,QAAA,IAAI,QAAA,KAAa,EAAA,IAAM,MAAA,KAAW,EAAA,EAAI;AACpC,UAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,QAAA,GAAW,MAAA,GAAS,CAAC,QAAA,EAAU,MAAM,CAAA,GAAI,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAC7E,UAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC/B,YAAA,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,EAAE,CAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AACA,MAAA,cAAA,GAAiB,EAAA;AACjB,MAAA,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,IAAI,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,IACvD,CAAA;AAAA,IAEA,cAAA,GAAiB;AACf,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,OAAA,CAAQ,IAAA,CAAK,kBAAA,kBAAoB,IAAI,GAAA,EAAK,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,cAAA,EAAgB,MAAM,IAAI,GAAA,CAAI,WAAW,CAAA;AAAA,IAEzC,aAAA,CAAc,WAAW,EAAA,EAAI;AAC3B,MAAA,OAAA,GAAU,mBAAmB,IAAA,CAAK,SAAA,EAAU,EAAG,EAAE,UAAU,CAAA;AAAA,IAC7D,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,EAAK;AAC5B,MAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,EAAK;AAC5B,MAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,OAAA,EAAS,MAAM,OAAA,EAAS,OAAA,EAAQ,IAAK,KAAA;AAAA,IACrC,OAAA,EAAS,MAAM,OAAA,EAAS,OAAA,EAAQ,IAAK,KAAA;AAAA,IAErC,EAAA,CAAwC,OAAU,OAAA,EAA8C;AAC9F,MAAA,OAAO,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,IAClC,CAAA;AAAA,IAEA,mBAAmB,MAAA,EAAmC;AACpD,MAAA,eAAA,GAAkB,MAAA;AAAA,IACpB,CAAA;AAAA,IAEA,SAAS,MAAM,IAAA;AAAA,IAEf,OAAA,GAAU;AACR,MAAA,eAAA,EAAgB;AAChB,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,OAAA,CAAQ,kBAAA,EAAmB;AAC3B,MAAA,iBAAA,CAAkB,KAAA,EAAM;AACxB,MAAA,gBAAA,CAAiB,KAAA,EAAM;AACvB,MAAA,WAAA,CAAY,KAAA,EAAM;AAAA,IACpB;AAAA,GACF;AAEA,EAAA,OAAO,UAAA;AACT;;;ACzcO,IAAM,kBAAN,MAAsB;AAAA,EAK3B,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAFlD,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAqB;AAG3C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,MAAA;AAAA,EAClC;AAAA;AAAA,EAGA,SAAS,SAAA,EAA8B;AACrC,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,gBAAA,CAA8B,iBAAiB,CAAA;AACxE,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,eAAe,CAAA;AAC1C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,EAAA,CAAG,uBAAuB,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,SAAA,EAA8B;AACpC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AAE/B,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,gBAAA,CAA8B,iBAAiB,CAAA;AACxE,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,eAAe,CAAA;AAC1C,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACrC,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,OAAA,GAAU,GAAG,qBAAA,EAAsB;AAEzC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA;AACtC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAA;AAErC,MAAA,IAAI,IAAA,CAAK,IAAI,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,EAAG;AAElD,MAAA,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,CAAA,UAAA,EAAa,MAAM,OAAO,MAAM,CAAA,GAAA,CAAA;AACrD,MAAA,EAAA,CAAG,MAAM,UAAA,GAAa,MAAA;AAEtB,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,EAAA,CAAG,MAAM,UAAA,GAAa,CAAA,UAAA,EAAa,KAAK,QAAQ,CAAA,GAAA,EAAM,KAAK,MAAM,CAAA,CAAA;AACjE,QAAA,EAAA,CAAG,MAAM,SAAA,GAAY,EAAA;AAErB,QAAA,MAAM,QAAQ,MAAM;AAClB,UAAA,EAAA,CAAG,MAAM,UAAA,GAAa,EAAA;AACtB,UAAA,EAAA,CAAG,mBAAA,CAAoB,iBAAiB,KAAK,CAAA;AAAA,QAC/C,CAAA;AACA,QAAA,EAAA,CAAG,iBAAiB,eAAA,EAAiB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,MAC5D,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF;;;ACpDO,IAAM,kBAAN,MAAsB;AAAA,EAI3B,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,SAAA,CACE,SAAA,EACA,cAAA,EACA,UAAA,EACA,QAAA,EACc;AACd,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA;AACtF,IAAA,MAAM,YAAA,GAAe,KAAK,IAAA,CAAK,cAAA,GAAiB,KAAK,UAAU,CAAA,GAAI,IAAI,IAAA,CAAK,QAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,aAAa,YAAY,CAAA;AAE/D,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,IAAS,IAAI,UAAA,EAAY,CAAA,GAAI,YAAY,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACjE,MAAA,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,aAAa,IAAA,CAAK,UAAA;AAAA,MAC3B,WAAA,EAAa,aAAa,IAAA,CAAK,UAAA;AAAA,MAC/B;AAAA,KACF;AAAA,EACF;AACF;;;AC3CO,SAAS,sBAAsB,OAAA,EAAuC;AAC3E,EAAA,MAAM,EAAE,EAAA,EAAI,MAAA,GAAS,CAAA,EAAE,GAAI,OAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,cAAc,KAAK,CAAA;AAC9B,EAAA,iBAAA,CAAkB,EAAA,EAAI;AAAA,IACpB,SAAA,EAAW;AAAA,GACZ,CAAA;AACD,EAAA,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAC3B,EAAA,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAC9B,EAAA,EAAA,CAAG,MAAM,UAAA,GAAa,6BAAA;AACtB,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,IAAiB,MAAA,EAAuB;AACxE,EAAA,iBAAA,CAAkB,EAAA,EAAI,EAAE,aAAA,EAAe,MAAA,EAAQ,CAAA;AACjD;;;ACJO,SAAS,UAAA,CACd,QACA,WAAA,EACA,UAAA,EACA,SACA,QAAA,GAA0B,IAAA,EAC1B,QAAQ,CAAA,EACK;AACb,EAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAgB,cAAA,EAAe,GAAI,OAAA;AAExD,EAAA,MAAM,SAAA,GAAY,cAAc,KAAA,EAAO;AAAA,IACrC,IAAA,EAAM,QAAA,KAAa,IAAA,GAAO,MAAA,GAAS;AAAA,GACpC,CAAA;AACD,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,SAAA,CAAU,YAAA,CAAa,sBAAsB,MAAM,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,QAAQ,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,YAAA,EAAa,CAAE,QAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,WAAW,cAAA,EAAe;AAC9C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAQ,CAAE,aAAA,EAAc;AAGjD,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,MAAM,SAAA,GAAY,sBAAsB,EAAE,EAAA,EAAI,QAAQ,QAAQ,CAAA,CAAA,EAAI,MAAA,EAAQ,cAAA,EAAgB,CAAA;AAC1F,IAAA,UAAA,CAAW,gBAAA,CAAiB,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA;AACzD,IAAA,SAAA,CAAU,YAAY,SAAS,CAAA;AAAA,EACjC,CAAA,MAAO;AACL,IAAA,MAAM,YAAY,qBAAA,CAAsB,EAAE,IAAI,YAAA,EAAc,MAAA,EAAQ,gBAAgB,CAAA;AACpF,IAAA,UAAA,CAAW,gBAAA,CAAiB,cAAc,SAAS,CAAA;AACnD,IAAA,SAAA,CAAU,YAAY,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAE5B,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAG3B,IAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,EAAE,EAAA,EAAI,CAAA,OAAA,EAAU,MAAM,EAAE,CAAA,CAAA,EAAI,MAAA,EAAQ,cAAA,EAAgB,CAAA;AAC7F,IAAA,UAAA,CAAW,gBAAA,CAAiB,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,IAAI,UAAU,CAAA;AAC5D,IAAA,SAAA,CAAU,YAAY,UAAU,CAAA;AAEhC,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACtD,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,KAAM,KAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,KAAA,EAAO,KAAA,CAAM,EAAE,CAAA;AAGhD,IAAA,IAAI,UAAA,GAAiC,IAAA;AACrC,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,UAAA,GAAa,UAAA,CAAW,QAAQ,WAAA,EAAa,UAAA,EAAY,SAAS,KAAA,CAAM,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,GAAA,GAA0B;AAAA,MAC9B,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,UAAA;AAAA,MACA,UAAA,EAAY,MAAM,EAAA,KAAO,QAAA;AAAA,MACzB,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,MACpC,gBAAgB,WAAA,GAAc,MAAM,WAAW,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,KAC1E;AAEA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACtC,IAAA,iBAAA,CAAkB,OAAA,EAAS;AAAA,MACzB,YAAY,KAAA,CAAM,EAAA;AAAA,MAClB,cAAc,KAAA,CAAM,IAAA;AAAA,MACpB,KAAA,EAAO,OAAO,UAAU,CAAA;AAAA,MACxB,QAAA,EAAU,MAAM,EAAA,KAAO,QAAA;AAAA,MACvB,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,EAAE;AAAA,KACnC,CAAA;AAGD,IAAA,UAAA,CAAW,iBAAA,CAAkB,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AAG9C,IAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,UAAU,CAAA;AACvC,IAAA,OAAA,CAAQ,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA;AACzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IAC1D;AACA,IAAA,OAAA,CAAQ,YAAA,CAAa,YAAY,IAAI,CAAA;AAErC,IAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,MAAM,OAAA,GAAU,sBAAsB,EAAE,EAAA,EAAI,OAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,EAAQ,cAAA,EAAgB,CAAA;AACvF,IAAA,UAAA,CAAW,gBAAA,CAAiB,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA;AACtD,IAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAAA,EAC/B,CAAA,MAAO;AACL,IAAA,MAAM,UAAU,qBAAA,CAAsB,EAAE,IAAI,UAAA,EAAY,MAAA,EAAQ,gBAAgB,CAAA;AAChF,IAAA,UAAA,CAAW,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAC/C,IAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,SAAA;AACT;;;ACnGO,SAAS,qBAAA,CACd,YACA,OAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAa,cAAA,EAAgB,eAAc,GAAI,OAAA;AAClE,EAAA,MAAM,cAAA,GAAkB,UAAA,CAAW,OAAA,EAAQ,CAAU,kBAAkB,EAAC;AAExE,EAAA,SAAS,MAAA,CAAO,QAAa,WAAA,EAA4C;AAEvE,IAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAGtB,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,EAAQ,WAAA,EAAa,UAAA,EAAY;AAAA,MACvD,WAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,EAAA,CAAG,QAAA,EAAU,MAAM,CAAA;AAGlD,EAAA,MAAA,CAAO,UAAA,CAAW,SAAA,EAAU,EAAG,UAAA,CAAW,gBAAgB,CAAA;AAE1D,EAAA,MAAM,WAA4B,MAAM;AACtC,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AACA,EAAA,QAAA,CAAS,UAAU,MAAM;AACvB,IAAA,MAAA,CAAO,UAAA,CAAW,SAAA,EAAU,EAAG,UAAA,CAAW,gBAAgB,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,OAAO,QAAA;AACT;;;AC9CO,SAAS,mBAAmB,QAAA,EAAoC;AACrE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACrC,EAAA,iBAAA,CAAkB,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,CAAA;AAChD,EAAA,KAAA,CAAM,MAAM,OAAA,GAAU,KAAA;AACtB,EAAA,KAAA,CAAM,MAAM,aAAA,GAAgB,MAAA;AAC5B,EAAA,KAAA,CAAM,gBAAgB,mBAAmB,CAAA;AACzC,EAAA,KAAA,CAAM,gBAAgB,eAAe,CAAA;AACrC,EAAA,OAAO,KAAA;AACT;;;ACRO,SAAS,gBAAA,GAA+D;AAC7E,EAAA,MAAM,WAA2B,EAAC;AAElC,EAAA,OAAO;AAAA,IACL,IAAI,EAAA,EAAgB;AAClB,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,EAAA,IAAM,QAAA,CAAS,OAAA,EAAQ,EAAG;AACnC,QAAA,EAAA,EAAG;AAAA,MACL;AACA,MAAA,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,IACpB;AAAA,GACF;AACF","file":"index.mjs","sourcesContent":["import type { Rect, CollisionCandidate, CoreCollisionDetection } from '@dnd-block-tree/core'\n\n/**\n * Measure DOM rects for all registered drop zones and build CollisionCandidate[].\n * Snapshots rects once at drag start to prevent feedback loops.\n */\nexport function measureDropZoneRects(\n zones: Map<string, HTMLElement>\n): Map<string, Rect> {\n const rects = new Map<string, Rect>()\n for (const [id, el] of zones) {\n const domRect = el.getBoundingClientRect()\n rects.set(id, {\n top: domRect.top,\n left: domRect.left,\n width: domRect.width,\n height: domRect.height,\n right: domRect.right,\n bottom: domRect.bottom,\n })\n }\n return rects\n}\n\n/** Build collision candidates from a snapshot rect map */\nexport function buildCandidates(\n snapshotRects: Map<string, Rect>\n): CollisionCandidate[] {\n const candidates: CollisionCandidate[] = []\n for (const [id, rect] of snapshotRects) {\n candidates.push({ id, rect })\n }\n return candidates\n}\n\n/** Build a pointer rect from client coordinates */\nexport function pointerToRect(x: number, y: number): Rect {\n return {\n top: y,\n left: x,\n width: 1,\n height: 1,\n right: x + 1,\n bottom: y + 1,\n }\n}\n\n/** Run collision detection with snapshotted rects and pointer position */\nexport function detectCollision(\n detector: CoreCollisionDetection,\n snapshotRects: Map<string, Rect>,\n pointerX: number,\n pointerY: number\n): string | null {\n const candidates = buildCandidates(snapshotRects)\n const pointerRect = pointerToRect(pointerX, pointerY)\n const results = detector(candidates, pointerRect)\n return results.length > 0 ? results[0].id : null\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\n\nexport interface DragOverlayOptions {\n /** Custom renderer for the overlay content */\n renderOverlay?: (block: BaseBlock) => HTMLElement\n}\n\n/**\n * Floating drag overlay that follows the pointer during drag.\n * Creates and manages a fixed-position overlay element.\n */\nexport class DragOverlay {\n private overlay: HTMLElement | null = null\n private options: DragOverlayOptions\n\n constructor(options: DragOverlayOptions = {}) {\n this.options = options\n }\n\n show(block: BaseBlock, sourceEl: HTMLElement, x: number, y: number): void {\n this.hide()\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-drag-overlay', 'true')\n overlay.style.position = 'fixed'\n overlay.style.zIndex = '9999'\n overlay.style.pointerEvents = 'none'\n overlay.style.opacity = '0.7'\n overlay.style.backdropFilter = 'blur(4px)'\n overlay.style.willChange = 'transform'\n\n if (this.options.renderOverlay) {\n overlay.appendChild(this.options.renderOverlay(block))\n } else {\n // Default: clone the source element\n const rect = sourceEl.getBoundingClientRect()\n overlay.style.width = `${rect.width}px`\n const clone = sourceEl.cloneNode(true) as HTMLElement\n clone.style.margin = '0'\n overlay.appendChild(clone)\n }\n\n this.setPosition(overlay, x, y)\n document.body.appendChild(overlay)\n this.overlay = overlay\n }\n\n move(x: number, y: number): void {\n if (this.overlay) {\n this.setPosition(this.overlay, x, y)\n }\n }\n\n hide(): void {\n if (this.overlay) {\n this.overlay.remove()\n this.overlay = null\n }\n }\n\n private setPosition(el: HTMLElement, x: number, y: number): void {\n el.style.transform = `translate(${x}px, ${y}px)`\n }\n}\n","/** Create an element with attributes and optional children */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs?: Record<string, string>,\n children?: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n el.setAttribute(key, value)\n }\n }\n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n el.appendChild(document.createTextNode(child))\n } else {\n el.appendChild(child)\n }\n }\n }\n return el\n}\n\n/** Set data attributes from an object */\nexport function setDataAttributes(el: HTMLElement, data: Record<string, string | boolean | number>): void {\n for (const [key, value] of Object.entries(data)) {\n if (value === false) {\n el.removeAttribute(`data-${key}`)\n } else {\n el.setAttribute(`data-${key}`, String(value))\n }\n }\n}\n\n/** Find the closest ancestor with a given data attribute */\nexport function closestWithData(el: Element, dataAttr: string): HTMLElement | null {\n return el.closest(`[data-${dataAttr}]`) as HTMLElement | null\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\n\nexport interface PointerSensorOptions {\n activationDistance?: number\n}\n\nexport class PointerSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private activationDistance: number\n private isDragging = false\n private startX = 0\n private startY = 0\n private blockId: string | null = null\n\n private boundPointerDown: (e: PointerEvent) => void\n private boundPointerMove: (e: PointerEvent) => void\n private boundPointerUp: (e: PointerEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: PointerSensorOptions = {}) {\n this.callbacks = callbacks\n this.activationDistance = options.activationDistance ?? 8\n\n this.boundPointerDown = this.onPointerDown.bind(this)\n this.boundPointerMove = this.onPointerMove.bind(this)\n this.boundPointerUp = this.onPointerUp.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('pointerdown', this.boundPointerDown)\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('pointerdown', this.boundPointerDown)\n this.container = null\n }\n\n private onPointerDown(e: PointerEvent): void {\n // Only primary button\n if (e.button !== 0) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n this.startX = e.clientX\n this.startY = e.clientY\n this.isDragging = false\n\n document.addEventListener('pointermove', this.boundPointerMove)\n document.addEventListener('pointerup', this.boundPointerUp)\n }\n\n private onPointerMove(e: PointerEvent): void {\n const dx = e.clientX - this.startX\n const dy = e.clientY - this.startY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (!this.isDragging) {\n if (distance >= this.activationDistance) {\n this.isDragging = true\n this.callbacks.onDragStart(this.blockId!, this.startX, this.startY)\n }\n return\n }\n\n this.callbacks.onDragMove(e.clientX, e.clientY)\n }\n\n private onPointerUp(e: PointerEvent): void {\n if (this.isDragging) {\n this.callbacks.onDragEnd(e.clientX, e.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('pointermove', this.boundPointerMove)\n document.removeEventListener('pointerup', this.boundPointerUp)\n }\n}\n","/**\n * Trigger haptic feedback (vibration) on supported devices.\n * Safe to call in any environment -- no-ops when `navigator.vibrate` is unavailable.\n */\nexport function triggerHaptic(durationMs = 10): void {\n if (typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function') {\n navigator.vibrate(durationMs)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\nimport { closestWithData } from '../utils/dom'\nimport { triggerHaptic } from '../utils/haptic'\n\nexport interface TouchSensorOptions {\n longPressDelay?: number\n hapticFeedback?: boolean\n}\n\nexport class TouchSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: SensorCallbacks\n private longPressDelay: number\n private hapticFeedback: boolean\n private isDragging = false\n private pressTimer: ReturnType<typeof setTimeout> | null = null\n private blockId: string | null = null\n\n private boundTouchStart: (e: TouchEvent) => void\n private boundTouchMove: (e: TouchEvent) => void\n private boundTouchEnd: (e: TouchEvent) => void\n\n constructor(callbacks: SensorCallbacks, options: TouchSensorOptions = {}) {\n this.callbacks = callbacks\n this.longPressDelay = options.longPressDelay ?? 200\n this.hapticFeedback = options.hapticFeedback ?? true\n\n this.boundTouchStart = this.onTouchStart.bind(this)\n this.boundTouchMove = this.onTouchMove.bind(this)\n this.boundTouchEnd = this.onTouchEnd.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('touchstart', this.boundTouchStart, { passive: false })\n }\n\n detach(): void {\n this.cleanup()\n this.container?.removeEventListener('touchstart', this.boundTouchStart)\n this.container = null\n }\n\n private onTouchStart(e: TouchEvent): void {\n if (e.touches.length !== 1) return\n\n const draggable = closestWithData(e.target as Element, 'draggable-id')\n if (!draggable) return\n\n const id = draggable.getAttribute('data-draggable-id')\n if (!id) return\n\n this.blockId = id\n const touch = e.touches[0]\n\n this.pressTimer = setTimeout(() => {\n this.isDragging = true\n if (this.hapticFeedback) triggerHaptic()\n this.callbacks.onDragStart(this.blockId!, touch.clientX, touch.clientY)\n }, this.longPressDelay)\n\n document.addEventListener('touchmove', this.boundTouchMove, { passive: false })\n document.addEventListener('touchend', this.boundTouchEnd)\n document.addEventListener('touchcancel', this.boundTouchEnd)\n }\n\n private onTouchMove(e: TouchEvent): void {\n const touch = e.touches[0]\n\n if (!this.isDragging) {\n // Cancel long-press if finger moved before activation\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n this.cleanup()\n }\n return\n }\n\n e.preventDefault()\n this.callbacks.onDragMove(touch.clientX, touch.clientY)\n }\n\n private onTouchEnd(e: TouchEvent): void {\n if (this.isDragging) {\n const touch = e.changedTouches[0]\n this.callbacks.onDragEnd(touch.clientX, touch.clientY)\n }\n this.cleanup()\n }\n\n private cleanup(): void {\n if (this.pressTimer) {\n clearTimeout(this.pressTimer)\n this.pressTimer = null\n }\n this.isDragging = false\n this.blockId = null\n document.removeEventListener('touchmove', this.boundTouchMove)\n document.removeEventListener('touchend', this.boundTouchEnd)\n document.removeEventListener('touchcancel', this.boundTouchEnd)\n }\n}\n","import type { Sensor, SensorCallbacks } from './types'\n\nexport interface KeyboardSensorCallbacks extends SensorCallbacks {\n onFocusPrev(): void\n onFocusNext(): void\n onExpand(): void\n onCollapse(): void\n onFocusFirst(): void\n onFocusLast(): void\n onToggleExpand(): void\n onSelect(): void\n}\n\nexport class KeyboardSensor implements Sensor {\n private container: HTMLElement | null = null\n private callbacks: KeyboardSensorCallbacks\n private boundKeyDown: (e: KeyboardEvent) => void\n\n constructor(callbacks: KeyboardSensorCallbacks) {\n this.callbacks = callbacks\n this.boundKeyDown = this.onKeyDown.bind(this)\n }\n\n attach(container: HTMLElement): void {\n this.container = container\n container.addEventListener('keydown', this.boundKeyDown)\n }\n\n detach(): void {\n this.container?.removeEventListener('keydown', this.boundKeyDown)\n this.container = null\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n this.callbacks.onFocusPrev()\n break\n case 'ArrowDown':\n e.preventDefault()\n this.callbacks.onFocusNext()\n break\n case 'ArrowRight':\n e.preventDefault()\n this.callbacks.onExpand()\n break\n case 'ArrowLeft':\n e.preventDefault()\n this.callbacks.onCollapse()\n break\n case 'Home':\n e.preventDefault()\n this.callbacks.onFocusFirst()\n break\n case 'End':\n e.preventDefault()\n this.callbacks.onFocusLast()\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n this.callbacks.onToggleExpand()\n break\n case 'Escape':\n this.callbacks.onDragCancel()\n break\n }\n }\n}\n","import type { BaseBlock, HistoryState, HistoryAction } from '@dnd-block-tree/core'\nimport { historyReducer } from '@dnd-block-tree/core'\n\nexport interface BlockHistoryOptions {\n maxSteps?: number\n}\n\nexport interface BlockHistory<T extends BaseBlock> {\n push(blocks: T[]): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n getPresent(): T[]\n clear(blocks: T[]): void\n}\n\n/**\n * Imperative undo/redo history wrapping core's historyReducer.\n */\nexport function createBlockHistory<T extends BaseBlock>(\n initialBlocks: T[],\n options: BlockHistoryOptions = {}\n): BlockHistory<T> {\n const { maxSteps = 50 } = options\n\n let state: HistoryState<T> = {\n past: [],\n present: initialBlocks,\n future: [],\n }\n\n return {\n push(blocks: T[]) {\n state = historyReducer(state, { type: 'SET', payload: blocks, maxSteps })\n },\n\n undo(): T[] | null {\n if (state.past.length === 0) return null\n state = historyReducer(state, { type: 'UNDO' })\n return state.present\n },\n\n redo(): T[] | null {\n if (state.future.length === 0) return null\n state = historyReducer(state, { type: 'REDO' })\n return state.present\n },\n\n canUndo: () => state.past.length > 0,\n canRedo: () => state.future.length > 0,\n getPresent: () => state.present,\n\n clear(blocks: T[]) {\n state = { past: [], present: blocks, future: [] }\n },\n }\n}\n","import type {\n BaseBlock,\n BlockTreeInstance,\n CoreCollisionDetection,\n Rect,\n} from '@dnd-block-tree/core'\nimport {\n createBlockTree,\n createStickyCollision,\n EventEmitter,\n} from '@dnd-block-tree/core'\nimport type {\n BlockTreeControllerOptions,\n ControllerEvents,\n DragState,\n Unsubscribe,\n VanillaSensorConfig,\n} from './types'\nimport { measureDropZoneRects, detectCollision } from './collision-bridge'\nimport { DragOverlay } from './drag-overlay'\nimport { PointerSensor } from './sensors/pointer-sensor'\nimport { TouchSensor } from './sensors/touch-sensor'\nimport { KeyboardSensor } from './sensors/keyboard-sensor'\nimport type { SensorCallbacks } from './sensors/types'\nimport type { Sensor } from './sensors/types'\nimport { createBlockHistory, type BlockHistory } from './history'\n\nexport interface BlockTreeController<T extends BaseBlock = BaseBlock> {\n // Mounting\n mount(container: HTMLElement): void\n unmount(): void\n\n // Registration\n registerDraggable(id: string, element: HTMLElement): Unsubscribe\n registerDropZone(id: string, element: HTMLElement): Unsubscribe\n\n // State reads\n getDragState(): DragState\n getBlocks(): T[]\n getEffectiveBlocks(): T[]\n getExpandedMap(): Record<string, boolean>\n getBlock(id: string): T | undefined\n\n // Actions\n toggleExpand(id: string): void\n setExpandAll(expanded: boolean): void\n addBlock(type: T['type'], parentId?: string | null): T\n deleteBlock(id: string): void\n setBlocks(blocks: T[]): void\n\n // Selection\n select(id: string, mode: 'single' | 'toggle' | 'range'): void\n clearSelection(): void\n getSelectedIds(): Set<string>\n\n // History (opt-in)\n enableHistory(maxSteps?: number): void\n undo(): T[] | null\n redo(): T[] | null\n canUndo(): boolean\n canRedo(): boolean\n\n // Events\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe\n\n // Overlay\n setOverlayRenderer(render: (block: T) => HTMLElement): void\n\n // Tree instance (escape hatch)\n getTree(): BlockTreeInstance<T>\n\n // Cleanup\n destroy(): void\n}\n\nexport function createBlockTreeController<T extends BaseBlock>(\n options: BlockTreeControllerOptions<T> = {}\n): BlockTreeController<T> {\n const {\n initialBlocks = [],\n containerTypes = [],\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n sensors: sensorConfig,\n onChange,\n callbacks,\n } = options\n\n // Core tree instance\n const stickyCollision = createStickyCollision(15)\n const tree = createBlockTree<T>({\n initialBlocks,\n containerTypes,\n orderingStrategy,\n maxDepth,\n previewDebounce,\n canDrag,\n canDrop,\n idGenerator,\n initialExpanded,\n collisionDetection: stickyCollision,\n })\n\n // Emitter for controller-level events\n const emitter = new EventEmitter<ControllerEvents<T>>()\n\n // DOM state\n let container: HTMLElement | null = null\n const draggableElements = new Map<string, HTMLElement>()\n const dropZoneElements = new Map<string, HTMLElement>()\n let snapshotRects: Map<string, Rect> | null = null\n\n // Selection state\n const selectedIds = new Set<string>()\n let lastSelectedId: string | null = null\n\n // Sensors\n const activeSensors: Sensor[] = []\n\n // Overlay\n const overlay = new DragOverlay()\n let overlayRenderer: ((block: T) => HTMLElement) | null = null\n\n // History (opt-in)\n let history: BlockHistory<T> | null = null\n\n // Wire core tree events to callbacks and controller emitter\n tree.on('blocks:change', (blocks) => {\n onChange?.(blocks as T[])\n if (history) {\n history.push(blocks as T[])\n }\n emitter.emit('render', blocks as T[], tree.getExpandedMap())\n })\n tree.on('expand:change', () => {\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n })\n if (callbacks?.onDragStart) {\n tree.on('drag:start', (e) => callbacks.onDragStart!(e as any))\n }\n if (callbacks?.onDragEnd) {\n tree.on('drag:end', (e) => callbacks.onDragEnd!(e as any))\n }\n if (callbacks?.onBlockAdd) {\n tree.on('block:add', (e) => callbacks.onBlockAdd!(e as any))\n }\n if (callbacks?.onBlockDelete) {\n tree.on('block:delete', (e) => callbacks.onBlockDelete!(e as any))\n }\n if (callbacks?.onExpandChange) {\n tree.on('expand:change', (e) => callbacks.onExpandChange!(e as any))\n }\n if (callbacks?.onHoverChange) {\n tree.on('hover:change', (e) => callbacks.onHoverChange!(e as any))\n }\n\n // Sensor callbacks\n const sensorCallbacks: SensorCallbacks = {\n onDragStart(blockId: string, x: number, y: number) {\n const draggedIds = selectedIds.has(blockId) && selectedIds.size > 1\n ? [...selectedIds]\n : [blockId]\n\n const started = tree.startDrag(blockId, draggedIds)\n if (!started) return\n\n stickyCollision.reset()\n snapshotRects = measureDropZoneRects(dropZoneElements)\n\n // Show overlay\n const block = tree.getBlock(blockId)\n const el = draggableElements.get(blockId)\n if (block && el) {\n if (overlayRenderer) {\n overlay.show(block, el, x, y)\n } else {\n overlay.show(block, el, x, y)\n }\n }\n\n emitter.emit('drag:statechange', getDragState())\n },\n\n onDragMove(x: number, y: number) {\n if (!snapshotRects) return\n\n overlay.move(x, y)\n\n const detector = tree.getCollisionDetection()\n if (!detector) return\n\n const targetZone = detectCollision(detector, snapshotRects, x, y)\n if (targetZone) {\n tree.updateDrag(targetZone)\n }\n },\n\n onDragEnd(_x: number, _y: number) {\n const result = tree.endDrag()\n overlay.hide()\n snapshotRects = null\n\n if (result && callbacks?.onBlockMove) {\n // Fire block move callback\n callbacks.onBlockMove({\n block: tree.getBlock(tree.getBlocks()[0]?.id) as any,\n from: { parentId: null, index: 0 },\n to: { parentId: null, index: 0 },\n blocks: result.blocks as T[],\n movedIds: [],\n })\n }\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n onDragCancel() {\n tree.cancelDrag()\n overlay.hide()\n snapshotRects = null\n\n emitter.emit('drag:statechange', getDragState())\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n }\n\n function getDragState(): DragState {\n return {\n isDragging: tree.getActiveId() !== null,\n activeId: tree.getActiveId(),\n hoverZone: tree.getHoverZone(),\n }\n }\n\n function setupSensors(): void {\n const config: VanillaSensorConfig = sensorConfig ?? {}\n if (!container) return\n\n if (config.pointer !== false) {\n const pointer = new PointerSensor(sensorCallbacks, {\n activationDistance: config.activationDistance,\n })\n pointer.attach(container)\n activeSensors.push(pointer)\n }\n\n if (config.touch !== false) {\n const touch = new TouchSensor(sensorCallbacks, {\n longPressDelay: config.longPressDelay,\n hapticFeedback: config.hapticFeedback,\n })\n touch.attach(container)\n activeSensors.push(touch)\n }\n\n if (config.keyboard) {\n const visibleBlocks = () => tree.getEffectiveBlocks()\n let focusedIndex = -1\n\n const keyboard = new KeyboardSensor({\n ...sensorCallbacks,\n onFocusPrev() {\n const blocks = visibleBlocks()\n focusedIndex = Math.max(0, focusedIndex - 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onFocusNext() {\n const blocks = visibleBlocks()\n focusedIndex = Math.min(blocks.length - 1, focusedIndex + 1)\n const block = blocks[focusedIndex]\n if (block) focusDraggable(block.id)\n },\n onExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && !tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onCollapse() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type) && tree.isExpanded(block.id)) {\n tree.toggleExpand(block.id)\n }\n },\n onFocusFirst() {\n focusedIndex = 0\n const blocks = visibleBlocks()\n if (blocks[0]) focusDraggable(blocks[0].id)\n },\n onFocusLast() {\n const blocks = visibleBlocks()\n focusedIndex = blocks.length - 1\n if (blocks[focusedIndex]) focusDraggable(blocks[focusedIndex].id)\n },\n onToggleExpand() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block && containerTypes.includes(block.type)) {\n tree.toggleExpand(block.id)\n }\n },\n onSelect() {\n const blocks = visibleBlocks()\n const block = blocks[focusedIndex]\n if (block) {\n controller.select(block.id, 'toggle')\n }\n },\n })\n keyboard.attach(container)\n activeSensors.push(keyboard)\n }\n }\n\n function focusDraggable(id: string): void {\n const el = draggableElements.get(id)\n if (el) el.focus()\n }\n\n function teardownSensors(): void {\n for (const sensor of activeSensors) {\n sensor.detach()\n }\n activeSensors.length = 0\n }\n\n const controller: BlockTreeController<T> = {\n mount(el: HTMLElement) {\n container = el\n setupSensors()\n // Initial render\n emitter.emit('render', tree.getBlocks(), tree.getExpandedMap())\n },\n\n unmount() {\n teardownSensors()\n overlay.hide()\n container = null\n },\n\n registerDraggable(id: string, element: HTMLElement) {\n element.setAttribute('data-draggable-id', id)\n element.setAttribute('data-block-id', id)\n draggableElements.set(id, element)\n return () => {\n draggableElements.delete(id)\n }\n },\n\n registerDropZone(id: string, element: HTMLElement) {\n element.setAttribute('data-zone-id', id)\n dropZoneElements.set(id, element)\n return () => {\n dropZoneElements.delete(id)\n }\n },\n\n getDragState,\n getBlocks: () => tree.getBlocks(),\n getEffectiveBlocks: () => tree.getEffectiveBlocks(),\n getExpandedMap: () => tree.getExpandedMap(),\n getBlock: (id) => tree.getBlock(id),\n\n toggleExpand(id: string) {\n tree.toggleExpand(id)\n },\n\n setExpandAll(expanded: boolean) {\n tree.setExpandAll(expanded)\n },\n\n addBlock(type, parentId = null) {\n return tree.addBlock(type, parentId)\n },\n\n deleteBlock(id: string) {\n tree.deleteBlock(id)\n },\n\n setBlocks(blocks: T[]) {\n tree.setBlocks(blocks)\n },\n\n select(id: string, mode: 'single' | 'toggle' | 'range') {\n if (mode === 'single') {\n selectedIds.clear()\n selectedIds.add(id)\n } else if (mode === 'toggle') {\n if (selectedIds.has(id)) {\n selectedIds.delete(id)\n } else {\n selectedIds.add(id)\n }\n } else if (mode === 'range' && lastSelectedId) {\n const blocks = tree.getBlocks()\n const startIdx = blocks.findIndex(b => b.id === lastSelectedId)\n const endIdx = blocks.findIndex(b => b.id === id)\n if (startIdx !== -1 && endIdx !== -1) {\n const [from, to] = startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx]\n for (let i = from; i <= to; i++) {\n selectedIds.add(blocks[i].id)\n }\n }\n }\n lastSelectedId = id\n emitter.emit('selection:change', new Set(selectedIds))\n },\n\n clearSelection() {\n selectedIds.clear()\n lastSelectedId = null\n emitter.emit('selection:change', new Set())\n },\n\n getSelectedIds: () => new Set(selectedIds),\n\n enableHistory(maxSteps = 50) {\n history = createBlockHistory(tree.getBlocks(), { maxSteps })\n },\n\n undo() {\n if (!history) return null\n const blocks = history.undo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n redo() {\n if (!history) return null\n const blocks = history.redo()\n if (blocks) tree.setBlocks(blocks)\n return blocks\n },\n\n canUndo: () => history?.canUndo() ?? false,\n canRedo: () => history?.canRedo() ?? false,\n\n on<K extends keyof ControllerEvents<T>>(event: K, handler: ControllerEvents<T>[K]): Unsubscribe {\n return emitter.on(event, handler)\n },\n\n setOverlayRenderer(render: (block: T) => HTMLElement) {\n overlayRenderer = render\n },\n\n getTree: () => tree,\n\n destroy() {\n teardownSensors()\n overlay.hide()\n tree.destroy()\n emitter.removeAllListeners()\n draggableElements.clear()\n dropZoneElements.clear()\n selectedIds.clear()\n },\n }\n\n return controller\n}\n","import type { Rect } from '@dnd-block-tree/core'\n\nexport interface LayoutAnimationOptions {\n duration?: number\n easing?: string\n}\n\n/**\n * FLIP animation for block layout changes.\n * Records element positions before a DOM update, then animates from old to new.\n */\nexport class LayoutAnimation {\n private duration: number\n private easing: string\n private snapshots = new Map<string, DOMRect>()\n\n constructor(options: LayoutAnimationOptions = {}) {\n this.duration = options.duration ?? 200\n this.easing = options.easing ?? 'ease'\n }\n\n /** Record current positions of all block elements in a container */\n snapshot(container: HTMLElement): void {\n this.snapshots.clear()\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (id) {\n this.snapshots.set(id, el.getBoundingClientRect())\n }\n }\n }\n\n /** After DOM update, animate elements from old to new positions */\n animate(container: HTMLElement): void {\n if (this.snapshots.size === 0) return\n\n const blocks = container.querySelectorAll<HTMLElement>('[data-block-id]')\n for (const el of blocks) {\n const id = el.getAttribute('data-block-id')\n if (!id) continue\n\n const oldRect = this.snapshots.get(id)\n if (!oldRect) continue\n\n const newRect = el.getBoundingClientRect()\n\n const deltaX = oldRect.left - newRect.left\n const deltaY = oldRect.top - newRect.top\n\n if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) continue\n\n el.style.transform = `translate(${deltaX}px, ${deltaY}px)`\n el.style.transition = 'none'\n\n requestAnimationFrame(() => {\n el.style.transition = `transform ${this.duration}ms ${this.easing}`\n el.style.transform = ''\n\n const onEnd = () => {\n el.style.transition = ''\n el.removeEventListener('transitionend', onEnd)\n }\n el.addEventListener('transitionend', onEnd, { once: true })\n })\n }\n\n this.snapshots.clear()\n }\n}\n","export interface VirtualScrollerOptions {\n itemHeight: number\n overscan?: number\n}\n\nexport interface VirtualRange {\n startIndex: number\n endIndex: number\n offsetY: number\n totalHeight: number\n visibleIds: Set<string>\n}\n\n/**\n * Virtual scrolling for large trees.\n * Calculates visible range based on scroll position and viewport height.\n */\nexport class VirtualScroller {\n private itemHeight: number\n private overscan: number\n\n constructor(options: VirtualScrollerOptions) {\n this.itemHeight = options.itemHeight\n this.overscan = options.overscan ?? 5\n }\n\n /** Calculate the visible range for a given scroll state */\n calculate(\n scrollTop: number,\n viewportHeight: number,\n totalItems: number,\n blockIds: string[]\n ): VirtualRange {\n const startIndex = Math.max(0, Math.floor(scrollTop / this.itemHeight) - this.overscan)\n const visibleCount = Math.ceil(viewportHeight / this.itemHeight) + 2 * this.overscan\n const endIndex = Math.min(totalItems, startIndex + visibleCount)\n\n const visibleIds = new Set<string>()\n for (let i = startIndex; i < endIndex && i < blockIds.length; i++) {\n visibleIds.add(blockIds[i])\n }\n\n return {\n startIndex,\n endIndex,\n offsetY: startIndex * this.itemHeight,\n totalHeight: totalItems * this.itemHeight,\n visibleIds,\n }\n }\n}\n","import { createElement, setDataAttributes } from '../utils/dom'\n\nexport interface DropZoneOptions {\n id: string\n height?: number\n}\n\nexport function createDropZoneElement(options: DropZoneOptions): HTMLElement {\n const { id, height = 4 } = options\n const el = createElement('div')\n setDataAttributes(el, {\n 'zone-id': id,\n })\n el.style.height = `${height}px`\n el.style.minHeight = `${height}px`\n el.style.transition = 'background-color 150ms ease'\n return el\n}\n\nexport function setDropZoneActive(el: HTMLElement, active: boolean): void {\n setDataAttributes(el, { 'zone-active': active })\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport { getBlockDepth } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { RenderBlockContext } from '../types'\nimport { createElement, setDataAttributes } from '../utils/dom'\nimport { createDropZoneElement, setDropZoneActive } from './drop-zone'\n\nexport interface TreeRendererOptions<T extends BaseBlock> {\n renderBlock: (block: T, ctx: RenderBlockContext) => HTMLElement\n containerTypes: readonly string[]\n dropZoneHeight?: number\n}\n\n/**\n * Recursive DOM tree builder. Creates the full tree DOM from blocks.\n * Keyed by data-block-id for efficient reconciliation.\n */\nexport function renderTree<T extends BaseBlock>(\n blocks: T[],\n expandedMap: Record<string, boolean>,\n controller: BlockTreeController<T>,\n options: TreeRendererOptions<T>,\n parentId: string | null = null,\n depth = 0\n): HTMLElement {\n const { renderBlock, containerTypes, dropZoneHeight } = options\n\n const container = createElement('div', {\n role: parentId === null ? 'tree' : 'group',\n })\n if (parentId === null) {\n container.setAttribute('data-dnd-tree-root', 'true')\n }\n\n const children = blocks.filter(b => b.parentId === parentId)\n const activeId = controller.getDragState().activeId\n const selectedIds = controller.getSelectedIds()\n const index = controller.getTree().getBlockIndex()\n\n // Start zone for container\n if (parentId !== null) {\n const startZone = createDropZoneElement({ id: `into-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`into-${parentId}`, startZone)\n container.appendChild(startZone)\n } else {\n const rootStart = createDropZoneElement({ id: 'root-start', height: dropZoneHeight })\n controller.registerDropZone('root-start', rootStart)\n container.appendChild(rootStart)\n }\n\n for (const block of children) {\n // Skip actively dragged block (rendered in overlay)\n if (block.id === activeId) continue\n\n // Before zone\n const beforeZone = createDropZoneElement({ id: `before-${block.id}`, height: dropZoneHeight })\n controller.registerDropZone(`before-${block.id}`, beforeZone)\n container.appendChild(beforeZone)\n\n const isContainer = containerTypes.includes(block.type)\n const isExpanded = expandedMap[block.id] !== false\n const blockDepth = getBlockDepth(index, block.id)\n\n // Build children for containers\n let childrenEl: HTMLElement | null = null\n if (isContainer && isExpanded) {\n childrenEl = renderTree(blocks, expandedMap, controller, options, block.id, depth + 1)\n }\n\n const ctx: RenderBlockContext = {\n children: childrenEl,\n depth: blockDepth,\n isExpanded,\n isDragging: block.id === activeId,\n isSelected: selectedIds.has(block.id),\n onToggleExpand: isContainer ? () => controller.toggleExpand(block.id) : null,\n }\n\n const blockEl = renderBlock(block, ctx)\n setDataAttributes(blockEl, {\n 'block-id': block.id,\n 'block-type': block.type,\n depth: String(blockDepth),\n dragging: block.id === activeId,\n selected: selectedIds.has(block.id),\n })\n\n // Register as draggable\n controller.registerDraggable(block.id, blockEl)\n\n // ARIA attributes\n blockEl.setAttribute('role', 'treeitem')\n blockEl.setAttribute('aria-level', String(blockDepth + 1))\n if (isContainer) {\n blockEl.setAttribute('aria-expanded', String(isExpanded))\n }\n blockEl.setAttribute('tabindex', '-1')\n\n container.appendChild(blockEl)\n }\n\n // End zone\n if (parentId !== null) {\n const endZone = createDropZoneElement({ id: `end-${parentId}`, height: dropZoneHeight })\n controller.registerDropZone(`end-${parentId}`, endZone)\n container.appendChild(endZone)\n } else {\n const rootEnd = createDropZoneElement({ id: 'root-end', height: dropZoneHeight })\n controller.registerDropZone('root-end', rootEnd)\n container.appendChild(rootEnd)\n }\n\n return container\n}\n","import type { BaseBlock } from '@dnd-block-tree/core'\nimport type { BlockTreeController } from '../controller'\nimport type { DefaultRendererOptions, Unsubscribe, RenderBlockContext } from '../types'\nimport { renderTree } from './tree-renderer'\n\nexport interface DefaultRenderer extends Unsubscribe {\n /** Force a re-render */\n refresh(): void\n}\n\n/**\n * DefaultRenderer (Layer 2): Subscribes to controller events and\n * automatically creates/updates DOM. User provides a renderBlock function.\n */\nexport function createDefaultRenderer<T extends BaseBlock>(\n controller: BlockTreeController<T>,\n options: DefaultRendererOptions<T>\n): DefaultRenderer {\n const { container, renderBlock, dropZoneHeight, animateExpand } = options\n const containerTypes = (controller.getTree() as any).containerTypes ?? []\n\n function render(blocks: T[], expandedMap: Record<string, boolean>): void {\n // Clear existing DOM\n container.innerHTML = ''\n\n // Build fresh tree DOM\n const tree = renderTree(blocks, expandedMap, controller, {\n renderBlock,\n containerTypes,\n dropZoneHeight,\n })\n\n container.appendChild(tree)\n }\n\n // Subscribe to render events\n const unsubRender = controller.on('render', render)\n\n // Initial render\n render(controller.getBlocks(), controller.getExpandedMap())\n\n const renderer: DefaultRenderer = () => {\n unsubRender()\n }\n renderer.refresh = () => {\n render(controller.getBlocks(), controller.getExpandedMap())\n }\n\n return renderer\n}\n","import { setDataAttributes } from '../utils/dom'\n\n/** Create a semi-transparent in-flow preview of a block at its target position */\nexport function createGhostPreview(sourceEl: HTMLElement): HTMLElement {\n const ghost = sourceEl.cloneNode(true) as HTMLElement\n setDataAttributes(ghost, { 'dnd-ghost': 'true' })\n ghost.style.opacity = '0.3'\n ghost.style.pointerEvents = 'none'\n ghost.removeAttribute('data-draggable-id')\n ghost.removeAttribute('data-block-id')\n return ghost\n}\n","import type { Disposable } from '../types'\n\n/** Collect multiple cleanup functions into a single disposable */\nexport function createDisposable(): Disposable & { add(fn: () => void): void } {\n const cleanups: (() => void)[] = []\n\n return {\n add(fn: () => void) {\n cleanups.push(fn)\n },\n dispose() {\n for (const fn of cleanups.reverse()) {\n fn()\n }\n cleanups.length = 0\n },\n }\n}\n"]}