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
JavaScript
"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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