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