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.

225 lines 20.3 kB
"use strict"; /** * Block System - Operadic composition for UI components * Following category-theoretic operads for structured composition */ Object.defineProperty(exports, "__esModule", { value: true }); exports.walkBlocks = exports.sequence = exports.compose = exports.editableTextBlock = exports.listBlock = exports.containerBlock = exports.paragraphBlock = exports.headingBlock = exports.textBlock = exports.reactiveBlock = exports.block = exports.createBlock = exports.registerBlock = void 0; const signal_1 = require("../core/signal"); // Registry for block types const blockRegistry = new Map(); const registerBlock = (type, factory) => { blockRegistry.set(type, factory); }; exports.registerBlock = registerBlock; const createBlock = (type, props) => { const factory = blockRegistry.get(type); if (!factory) { throw new Error(`Block type "${type}" not registered`); } return factory(props); }; exports.createBlock = createBlock; // Base block implementation 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 (0, exports.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; }; exports.block = block; const reactiveBlock = (type, arity, renderFn, initialProps) => { const sig = (0, signal_1.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; }; exports.reactiveBlock = reactiveBlock; // Common block types const textBlock = (text) => (0, exports.block)('text', 0, (parent, props) => { const span = document.createElement('span'); span.textContent = props.text || text; parent.appendChild(span); return span; }, { text }); exports.textBlock = textBlock; const headingBlock = (level, text) => (0, exports.block)('heading', 0, (parent, props) => { const heading = document.createElement(`h${props.level}`); heading.textContent = props.text; parent.appendChild(heading); return heading; }, { level, text }); exports.headingBlock = headingBlock; const paragraphBlock = (text) => (0, exports.block)('paragraph', 0, (parent, props) => { const p = document.createElement('p'); p.textContent = props.text; parent.appendChild(p); return p; }, { text }); exports.paragraphBlock = paragraphBlock; const containerBlock = (className) => (0, exports.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 }); exports.containerBlock = containerBlock; const listBlock = (ordered = false) => (0, exports.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 }); exports.listBlock = listBlock; // Reactive text block that can be edited const editableTextBlock = (initialText) => (0, exports.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 }); exports.editableTextBlock = editableTextBlock; // Block composition utilities 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); }; exports.compose = compose; const sequence = (blocks) => (0, exports.containerBlock)().plug(blocks); exports.sequence = sequence; // Block tree traversal 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 }; exports.walkBlocks = walkBlocks; // Register default block types (0, exports.registerBlock)('text', (props) => (0, exports.textBlock)(props.text)); (0, exports.registerBlock)('heading', (props) => (0, exports.headingBlock)(props.level, props.text)); (0, exports.registerBlock)('paragraph', (props) => (0, exports.paragraphBlock)(props.text)); (0, exports.registerBlock)('container', (props) => (0, exports.containerBlock)(props.className)); (0, exports.registerBlock)('list', (props) => (0, exports.listBlock)(props.ordered)); (0, exports.registerBlock)('editable-text', (props) => (0, exports.editableTextBlock)(props.text)); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2tzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJDQUFnRDtBQXFCaEQsMkJBQTJCO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0FBRS9DLE1BQU0sYUFBYSxHQUFHLENBQzNCLElBQVksRUFDWixPQUF3QixFQUNsQixFQUFFO0lBQ1IsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBTFcsUUFBQSxhQUFhLGlCQUt4QjtBQUVLLE1BQU0sV0FBVyxHQUFHLENBQVUsSUFBWSxFQUFFLEtBQVEsRUFBUyxFQUFFO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksa0JBQWtCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBTlcsUUFBQSxXQUFXLGVBTXRCO0FBRUYsNEJBQTRCO0FBQ3JCLE1BQU0sS0FBSyxHQUFHLENBQ25CLElBQVksRUFDWixLQUFhLEVBQ2IsUUFBNkUsRUFDN0UsUUFBYSxFQUFFLEVBQ1IsRUFBRTtJQUNULE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hFLElBQUksT0FBTyxHQUF1QixJQUFJLENBQUM7SUFDdkMsSUFBSSxRQUFRLEdBQVksRUFBRSxDQUFDO0lBQzNCLElBQUks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