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
JavaScript
/**
* 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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