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.

327 lines 26.8 kB
/** * DOM Adapter - Bridges categorical primitives to browser APIs * Provides vanilla DOM integration for Signal-Σ, Blocks, CRDTs, and Scheduler */ import { signal } from '../../core/signal'; import { getGlobalScheduler, Priority } from '../../scheduler'; export const domSignal = (initial) => { const sig = signal(initial); const domSig = { ...sig, bindToElement: (element, property) => { const updateElement = (value) => { element[property] = value; }; updateElement(sig.value()); return sig.subscribe(updateElement); }, bindToAttribute: (element, attribute) => { const updateAttribute = (value) => { element.setAttribute(attribute, String(value)); }; updateAttribute(sig.value()); return sig.subscribe(updateAttribute); }, bindToTextContent: (element) => { const updateText = (value) => { element.textContent = String(value); }; updateText(sig.value()); return sig.subscribe(updateText); }, bindToValue: (element) => { const updateValue = (value) => { element.value = String(value); }; const handleInput = () => { sig._set(element.value); }; updateValue(sig.value()); element.addEventListener('input', handleInput); const unsubscribe = sig.subscribe(updateValue); return () => { element.removeEventListener('input', handleInput); unsubscribe(); }; }, }; return domSig; }; // Convenience functions for common DOM operations export const bindElement = (element, signal) => { const updateElement = (value) => { element.textContent = String(value); }; updateElement(signal.value()); return signal.subscribe(updateElement); }; export const bindAttribute = (element, attribute, signal) => { const updateAttribute = (value) => { element.setAttribute(attribute, String(value)); }; updateAttribute(signal.value()); return signal.subscribe(updateAttribute); }; export const bindProperty = (element, property, signal) => { const updateProperty = (value) => { element[property] = value; }; updateProperty(signal.value()); return signal.subscribe(updateProperty); }; export const bindEvent = (element, event, signal, extractor = (e) => e.target.value) => { const handler = (e) => { signal._set(extractor(e)); }; element.addEventListener(event, handler); return () => { element.removeEventListener(event, handler); }; }; // DOM Block utilities export const domBlock = (tag, props = {}) => { const id = `dom-${tag}-${Math.random().toString(36).substr(2, 9)}`; let element = null; let children = []; return { id, arity: Infinity, render: (parent) => { if (element) { parent.appendChild(element); return element; } element = document.createElement(tag); // Apply properties Object.entries(props).forEach(([key, value]) => { if (key === 'className') { element.className = value; } else if (key === 'style' && typeof value === 'object') { Object.assign(element.style, value); } else if (key.startsWith('on') && typeof value === 'function') { const eventName = key.slice(2).toLowerCase(); element.addEventListener(eventName, value); } else { element.setAttribute(key, String(value)); } }); // Render children children.forEach((child) => child.render(element)); parent.appendChild(element); return element; }, plug: (newChildren) => { children = [...newChildren]; // If already rendered, update children if (element) { // Clear existing children element.innerHTML = ''; // Render new children children.forEach((child) => child.render(element)); } return domBlock(tag, props); }, destroy: () => { children.forEach((child) => child.destroy()); if (element && element.parentNode) { element.parentNode.removeChild(element); } element = null; children = []; }, }; }; // Reactive DOM block export const reactiveDOMBlock = (tag, propsSignal) => { const id = `reactive-dom-${tag}-${Math.random().toString(36).substr(2, 9)}`; let element = null; let children = []; const updateElement = (props) => { if (!element) return; // Clear existing attributes and event listeners Array.from(element.attributes).forEach((attr) => { if (!attr.name.startsWith('data-block-')) { element.removeAttribute(attr.name); } }); // Apply new properties Object.entries(props).forEach(([key, value]) => { if (key === 'className') { element.className = value; } else if (key === 'style' && typeof value === 'object') { Object.assign(element.style, value); } else if (key.startsWith('on') && typeof value === 'function') { const eventName = key.slice(2).toLowerCase(); element.addEventListener(eventName, value); } else { element.setAttribute(key, String(value)); } }); }; const instance = { id, arity: Infinity, signal: propsSignal, render: (parent) => { if (element) { parent.appendChild(element); return element; } element = document.createElement(tag); element.setAttribute('data-block-id', id); element.setAttribute('data-block-type', `reactive-dom-${tag}`); // Initial render updateElement(propsSignal.value()); // Subscribe to changes propsSignal.subscribe(updateElement); // Render children children.forEach((child) => child.render(element)); parent.appendChild(element); return element; }, plug: (newChildren) => { children = [...newChildren]; // If already rendered, update children if (element) { // Clear existing children element.innerHTML = ''; // Render new children children.forEach((child) => child.render(element)); } return instance; }, update: (newProps) => { propsSignal._set(newProps); }, destroy: () => { children.forEach((child) => child.destroy()); if (element && element.parentNode) { element.parentNode.removeChild(element); } element = null; children = []; }, }; return instance; }; // CRDT DOM synchronization export const syncCRDTToDOM = (reactiveCRDT, element, renderer) => { const updateDOM = (value) => { getGlobalScheduler().schedule({ id: `crdt-sync-${element.id || 'unknown'}`, priority: Priority.HIGH, execute: () => renderer(value, element), }); }; // Initial render updateDOM(reactiveCRDT.signal.value()); // Subscribe to changes return reactiveCRDT.subscribe(updateDOM); }; // Form utilities export const bindFormToSignal = (form, signal) => { const updateForm = (data) => { Object.entries(data).forEach(([key, value]) => { const input = form.querySelector(`[name="${key}"]`); if (input) { if (input.type === 'checkbox') { input.checked = Boolean(value); } else { input.value = String(value); } } }); }; const handleFormChange = () => { const formData = new FormData(form); const data = {}; const entries = Array.from(formData.entries()); for (const [key, value] of entries) { const input = form.querySelector(`[name="${key}"]`); if (input) { if (input.type === 'checkbox') { data[key] = input.checked; } else if (input.type === 'number') { data[key] = Number(value); } else { data[key] = value; } } } signal._set(data); }; // Initial sync updateForm(signal.value()); // Listen for form changes form.addEventListener('input', handleFormChange); form.addEventListener('change', handleFormChange); // Subscribe to signal changes const unsubscribe = signal.subscribe(updateForm); return () => { form.removeEventListener('input', handleFormChange); form.removeEventListener('change', handleFormChange); unsubscribe(); }; }; // Event delegation utilities export const delegate = (container, selector, eventType, handler) => { const delegatedHandler = (event) => { const target = event.target; const match = target.closest(selector); if (match && container.contains(match)) { handler(event, match); } }; container.addEventListener(eventType, delegatedHandler); return () => { container.removeEventListener(eventType, delegatedHandler); }; }; // Animation utilities export const animateElement = (element, keyframes, options = {}) => { return new Promise((resolve, reject) => { try { const animation = element.animate(keyframes, options); animation.addEventListener('finish', () => resolve()); animation.addEventListener('cancel', () => reject(new Error('Animation cancelled'))); } catch (error) { reject(error); } }); }; // Intersection Observer integration export const observeIntersection = (element, callback, options = {}) => { const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { callback(entry.isIntersecting, entry); }); }, options); observer.observe(element); return () => { observer.unobserve(element); observer.disconnect(); }; }; // Resize Observer integration export const observeResize = (element, callback) => { const observer = new ResizeObserver((entries) => { entries.forEach(callback); }); observer.observe(element); return () => { observer.unobserve(element); observer.disconnect(); }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWRhcHRlcnMvZG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQVUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFnQi9ELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFJLE9BQVUsRUFBZ0IsRUFBRTtJQUN2RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFNUIsTUFBTSxNQUFNLEdBQWlCO1FBQzNCLEdBQUcsR0FBRztRQUVOLGFBQWEsRUFBRSxDQUFDLE9BQW9CLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO1lBQ3hELE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7Z0JBQ2hDLE9BQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDckMsQ0FBQyxDQUFDO1lBRUYsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsZUFBZSxFQUFFLENBQUMsT0FBb0IsRUFBRSxTQUFpQixFQUFFLEVBQUU7WUFDM0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtnQkFDbkMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDO1lBRUYsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsaUJBQWlC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