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.

209 lines 18.9 kB
/** * Block System - Operadic composition for UI components * Following category-theoretic operads for structured composition */ import { signal } from '../core/signal'; // Registry for block types const blockRegistry = new Map(); export const registerBlock = (type, factory) => { blockRegistry.set(type, factory); }; export const createBlock = (type, props) => { const factory = blockRegistry.get(type); if (!factory) { throw new Error(`Block type "${type}" not registered`); } return factory(props); }; // Base block implementation export const block = (type, arity, renderFn, props = {}) => { const id = `${type}-${Math.random().toString(36).substr(2, 9)}`; let element = null; let children = []; let isDestroyed = false; const instance = { id, arity, render: (parent) => { if (isDestroyed) { throw new Error(`Block ${id} has been destroyed`); } if (element) { parent.appendChild(element); return element; } element = renderFn(parent, props, children); element.setAttribute('data-block-id', id); element.setAttribute('data-block-type', type); return element; }, plug: (newChildren) => { if (newChildren.length > arity) { throw new Error(`Block ${type} has arity ${arity} but received ${newChildren.length} children`); } return block(type, arity, renderFn, props); }, destroy: () => { if (isDestroyed) return; // Destroy children first children.forEach((child) => child.destroy()); // Remove from DOM if (element && element.parentNode) { element.parentNode.removeChild(element); } element = null; children = []; isDestroyed = true; }, }; return instance; }; export const reactiveBlock = (type, arity, renderFn, initialProps) => { const sig = signal(initialProps); let element = null; let children = []; let isDestroyed = false; const id = `${type}-${Math.random().toString(36).substr(2, 9)}`; const instance = { id, arity, signal: sig, render: (parent) => { if (isDestroyed) { throw new Error(`ReactiveBlock ${id} has been destroyed`); } if (element) { parent.appendChild(element); return element; } element = renderFn(parent, sig.value(), children, sig); element.setAttribute('data-block-id', id); element.setAttribute('data-block-type', type); // Subscribe to signal changes for reactive updates sig.subscribe((newProps) => { if (element && !isDestroyed) { // Re-render with new props const newElement = renderFn(parent, newProps, children, sig); newElement.setAttribute('data-block-id', id); newElement.setAttribute('data-block-type', type); if (element.parentNode) { element.parentNode.replaceChild(newElement, element); } element = newElement; } }); return element; }, plug: (newChildren) => { if (newChildren.length > arity) { throw new Error(`ReactiveBlock ${type} has arity ${arity} but received ${newChildren.length} children`); } children = [...newChildren]; // If already rendered, re-render with new children if (element && element.parentNode) { const parent = element.parentNode; const newElement = renderFn(parent, sig.value(), children, sig); newElement.setAttribute('data-block-id', id); newElement.setAttribute('data-block-type', type); parent.replaceChild(newElement, element); element = newElement; } return instance; }, update: (newProps) => { sig._set(newProps); }, destroy: () => { if (isDestroyed) return; // Destroy children first children.forEach((child) => child.destroy()); // Remove from DOM if (element && element.parentNode) { element.parentNode.removeChild(element); } element = null; children = []; isDestroyed = true; }, }; return instance; }; // Common block types export const textBlock = (text) => block('text', 0, (parent, props) => { const span = document.createElement('span'); span.textContent = props.text || text; parent.appendChild(span); return span; }, { text }); export const headingBlock = (level, text) => block('heading', 0, (parent, props) => { const heading = document.createElement(`h${props.level}`); heading.textContent = props.text; parent.appendChild(heading); return heading; }, { level, text }); export const paragraphBlock = (text) => block('paragraph', 0, (parent, props) => { const p = document.createElement('p'); p.textContent = props.text; parent.appendChild(p); return p; }, { text }); export const containerBlock = (className) => block('container', Infinity, (parent, props, children) => { const div = document.createElement('div'); if (props.className) { div.className = props.className; } // Render all children children.forEach((child) => child.render(div)); parent.appendChild(div); return div; }, { className }); export const listBlock = (ordered = false) => block('list', Infinity, (parent, props, children) => { const list = document.createElement(props.ordered ? 'ol' : 'ul'); // Render children as list items children.forEach((child) => { const li = document.createElement('li'); child.render(li); list.appendChild(li); }); parent.appendChild(list); return list; }, { ordered }); // Reactive text block that can be edited export const editableTextBlock = (initialText) => reactiveBlock('editable-text', 0, (parent, props, _children, signal) => { const input = document.createElement('input'); input.type = 'text'; input.value = props.text; input.addEventListener('input', () => { signal._set({ ...props, text: input.value }); }); parent.appendChild(input); return input; }, { text: initialText }); // Block composition utilities export const compose = (...blocks) => { if (blocks.length === 0) { throw new Error('Cannot compose empty block list'); } if (blocks.length === 1) { return blocks[0]; } const [first, ...rest] = blocks; return first.plug(rest); }; export const sequence = (blocks) => containerBlock().plug(blocks); // Block tree traversal export const walkBlocks = (block, visitor) => { visitor(block); // Note: In a full implementation, we'd need to track children // This is a simplified version for the current interface }; // Register default block types registerBlock('text', (props) => textBlock(props.text)); registerBlock('heading', (props) => headingBlock(props.level, props.text)); registerBlock('paragraph', (props) => paragraphBlock(props.text)); registerBlock('container', (props) => containerBlock(props.className)); registerBlock('list', (props) => listBlock(props.ordered)); registerBlock('editable-text', (props) => editableTextBlock(props.text)); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2tzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQVUsTUFBTSxnQkFBZ0IsQ0FBQztBQXFCaEQsMkJBQTJCO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUMzQixJQUFZLEVBQ1osT0FBd0IsRUFDbEIsRUFBRTtJQUNSLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFVLElBQVksRUFBRSxLQUFRLEVBQVMsRUFBRTtJQUNwRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLGtCQUFrQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUVGLDRCQUE0QjtBQUM1QixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsSUFBWSxFQUNaLEtBQWEsRUFDYixRQUE2RSxFQUM3RSxRQUFhLEVBQUUsRUFDUixFQUFFO0lBQ1QsTUFBTSxFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDaEUsSUFBSSxPQUFPLEdBQXVCLElBQUksQ0FBQztJQUN2QyxJQUFJLFFBQVEsR0FBWSxFQUFFLENB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