UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

334 lines (329 loc) 26.1 kB
"use strict"; /** * Drag-n-Drop Reorder System * Uses Block.plug() with operad patterns for compositional drag-drop */ Object.defineProperty(exports, "__esModule", { value: true }); exports.composeDragBehaviors = exports.createDragContainer = exports.DragContainer = void 0; const signal_1 = require("../core/signal"); const blocks_1 = require("../blocks"); // Drag container using operad composition class DragContainer { constructor(container, initialItems = [], config) { this.config = config; this.items = (0, signal_1.signal)(initialItems); this.dragState = (0, signal_1.signal)({ isDragging: false, draggedItem: null, draggedIndex: -1, targetIndex: -1, offset: { x: 0, y: 0 }, }); this.operations = (0, signal_1.signal)([]); this.containerElement = container; this.blocks = new Map(); this.setupContainer(); this.bindEvents(); this.render(); } // Operad composition: plug draggable behavior into blocks createDraggableBlock(item, index) { const itemBlock = (0, blocks_1.block)('item', 0, (parent, _props, _children) => { const element = document.createElement('div'); element.innerHTML = this.config.itemRenderer(item, index); parent.appendChild(element); return element; }); // Plug drag behavior into item block using operad composition const draggableBlock = this.plugDragBehavior(itemBlock, item, index); return draggableBlock; } // Block.plug() implementation for drag behavior plugDragBehavior(itemBlock, _item, index) { return (0, blocks_1.block)('draggable-item', 0, (parent, _props, _children) => { const wrapper = document.createElement('div'); wrapper.className = 'draggable-item'; wrapper.setAttribute('data-index', index.toString()); wrapper.setAttribute('draggable', 'true'); const isDragging = this.dragState.value().draggedIndex === index; wrapper.style.cssText = ` cursor: grab; transition: transform 0.2s ease; ${isDragging ? 'opacity: 0.5; transform: scale(0.95);' : ''} `; const content = itemBlock.render(wrapper); wrapper.appendChild(content); parent.appendChild(wrapper); return wrapper; }); } // Setup container with drag-drop styling setupContainer() { this.containerElement.style.position = 'relative'; this.containerElement.style.minHeight = '50px'; this.containerElement.classList.add('drag-container'); // Add CSS for drag states const style = document.createElement('style'); style.textContent = ` .drag-container { user-select: none; } .draggable-item { position: relative; z-index: 1; } .draggable-item:hover { cursor: grab; } .draggable-item.dragging { cursor: grabbing; z-index: 1000; pointer-events: none; } .drag-placeholder { background: rgba(0, 123, 255, 0.1); border: 2px dashed rgba(0, 123, 255, 0.3); border-radius: 4px; margin: 2px 0; min-height: 40px; transition: all 0.2s ease; } .drag-ghost { position: fixed; pointer-events: none; z-index: 10000; opacity: 0.8; transform: rotate(5deg); box-shadow: 0 5px 15px rgba(0,0,0,0.3); } `; document.head.appendChild(style); } // Bind drag events using operad composition bindEvents() { // Dragstart event this.containerElement.addEventListener('dragstart', (e) => { const target = e.target; const draggableItem = target.closest('.draggable-item'); if (!draggableItem) return; const index = parseInt(draggableItem.dataset.index || '0'); const item = this.items.value()[index]; // Create drag ghost this.createDragGhost(draggableItem, e); // Update drag state const newState = { isDragging: true, draggedItem: item, draggedIndex: index, targetIndex: index, offset: { x: e.clientX - draggableItem.getBoundingClientRect().left, y: e.clientY - draggableItem.getBoundingClientRect().top, }, }; draggableItem.classList.add('dragging'); this.dragState._set(newState); }); // Dragover event for drop zones this.containerElement.addEventListener('dragover', (e) => { e.preventDefault(); const currentState = this.dragState.value(); if (!currentState.isDragging) return currentState; const targetIndex = this.getDropIndex(e.clientY); return { ...currentState, targetIndex, }; }); // Drop event this.containerElement.addEventListener('drop', (e) => { e.preventDefault(); const currentState = this.dragState.value(); if (!currentState.isDragging || !currentState.draggedItem) { this.resetDragState(); return; } // Create drag operation const operation = { source: currentState.draggedIndex, target: currentState.targetIndex, item: currentState.draggedItem, timestamp: Date.now(), }; // Apply reorder using operad composition this.applyReorder(operation); // Clean up this.removeDragGhost(); document.querySelectorAll('.draggable-item').forEach((el) => { el.classList.remove('dragging'); }); this.resetDragState(); }); // Dragend event this.containerElement.addEventListener('dragend', () => { this.removeDragGhost(); document.querySelectorAll('.draggable-item').forEach((el) => { el.classList.remove('dragging'); }); this.resetDragState(); }); } // Create visual drag ghost createDragGhost(element, e) { const ghost = element.cloneNode(true); ghost.classList.add('drag-ghost'); ghost.style.width = element.offsetWidth + 'px'; ghost.style.left = e.clientX - this.dragState.value().offset.x + 'px'; ghost.style.top = e.clientY - this.dragState.value().offset.y + 'px'; document.body.appendChild(ghost); // Update ghost position on mouse move const updateGhost = (e) => { ghost.style.left = e.clientX - this.dragState.value().offset.x + 'px'; ghost.style.top = e.clientY - this.dragState.value().offset.y + 'px'; }; document.addEventListener('dragover', updateGhost); // Store cleanup function ghost._cleanup = () => { document.removeEventListener('dragover', updateGhost); }; } // Remove drag ghost removeDragGhost() { const ghost = document.querySelector('.drag-ghost'); if (ghost) { ghost._cleanup?.(); ghost.remove(); } } // Calculate drop index based on mouse position getDropIndex(clientY) { const items = this.containerElement.querySelectorAll('.draggable-item'); const tolerance = this.config.tolerance || 5; for (let i = 0; i < items.length; i++) { const item = items[i]; const rect = item.getBoundingClientRect(); const midpoint = rect.top + rect.height / 2; if (clientY < midpoint + tolerance) { return i; } } return items.length; } // Apply reorder using operad composition applyReorder(operation) { const currentItems = this.items.value(); const newItems = [...currentItems]; // Remove item from source position const [movedItem] = newItems.splice(operation.source, 1); // Insert at target position const insertIndex = operation.target > operation.source ? operation.target - 1 : operation.target; newItems.splice(insertIndex, 0, movedItem); // Update items signal this.items._set(newItems); // Record operation this.operations._set([...this.operations.value(), operation]); // Notify callback this.config.onReorder?.(newItems, operation); // Re-render this.render(); } // Reset drag state resetDragState() { return { isDragging: false, draggedItem: null, draggedIndex: -1, targetIndex: -1, offset: { x: 0, y: 0 }, }; } // Render items using block composition render() { const items = this.items.value(); this.blocks.clear(); // Create blocks for each item using operad composition const itemBlocks = items.map((item, index) => { const block = this.createDraggableBlock(item, index); this.blocks.set(index, block); return block.render(document.createElement('div')); }); // Render placeholder if dragging const dragState = this.dragState.value(); if (dragState.isDragging && dragState.targetIndex !== dragState.draggedIndex) { const placeholder = document.createElement('div'); placeholder.className = 'drag-placeholder'; placeholder.innerHTML = '<div class="drag-placeholder"></div>'; itemBlocks.splice(dragState.targetIndex, 0, placeholder); } // Clear container and append all blocks this.containerElement.innerHTML = ''; itemBlocks.forEach((block) => { if (typeof block === 'string') { this.containerElement.innerHTML += block; } else { this.containerElement.appendChild(block); } }); } // Public API getItems() { return this.items.value(); } setItems(items) { this.items._set(items); this.render(); } addItem(item, index) { const currentItems = this.items.value(); const newItems = [...currentItems]; if (index !== undefined) { newItems.splice(index, 0, item); } else { newItems.push(item); } this.items._set(newItems); this.render(); } removeItem(index) { const currentItems = this.items.value(); const newItems = currentItems.filter((_, i) => i !== index); this.items._set(newItems); this.render(); } getOperations() { return this.operations.value(); } clearOperations() { this.operations._set([]); } } exports.DragContainer = DragContainer; // Factory function for creating drag containers const createDragContainer = (container, items, config) => { return new DragContainer(container, items, config); }; exports.createDragContainer = createDragContainer; // Operad composition utilities const composeDragBehaviors = (behaviors) => { return (item, index) => { return behaviors.reduce((acc, behavior) => { const behaviorBlock = behavior(item, index); return (0, blocks_1.block)('composed', 0, (parent, _props, _children) => { const accElement = acc.render(parent); const behaviorElement = behaviorBlock.render(parent); parent.appendChild(accElement); parent.appendChild(behaviorElement); return parent; }); }, (0, blocks_1.block)('empty', 0, (parent, _props, _children) => parent)); }; }; exports.composeDragBehaviors = composeDragBehaviors; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvZHJhZy1kcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJDQUFnRDtBQUNoRCxzQ0FBeUM7QUFnQ3pDLDBDQUEwQztBQUMxQyxNQUFhLGFBQWE7SUFPeEIsWUFDRSxTQUFzQixFQUN0QixlQUFvQixFQUFFLEVBQ2QsTUFLUDtRQUxPLFdBQU0sR0FBTixNQUFNLENBS2I7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUEsZUFBTSxFQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBQSxlQUFNLEVBQUM7WUFDdEIsVUFBVSxFQUFFLEtBQUs7WUFDakIsV0FBVyxFQUFFLElBQUk7WUFDakIsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoQixXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1NBQ3ZCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBQSxlQUFNLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELDBEQUEwRDtJQUNsRCxvQkFBb0IsQ0FBQyxJQUFPLEVBQUUsS0FBYTtRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFBLGNBQUssRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxT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