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.

343 lines 27.8 kB
"use strict"; /** * DOM Adapter - Bridges categorical primitives to browser APIs * Provides vanilla DOM integration for Signal-Σ, Blocks, CRDTs, and Scheduler */ Object.defineProperty(exports, "__esModule", { value: true }); exports.observeResize = exports.observeIntersection = exports.animateElement = exports.delegate = exports.bindFormToSignal = exports.syncCRDTToDOM = exports.reactiveDOMBlock = exports.domBlock = exports.bindEvent = exports.bindProperty = exports.bindAttribute = exports.bindElement = exports.domSignal = void 0; const signal_1 = require("../../core/signal"); const scheduler_1 = require("../../scheduler"); const domSignal = (initial) => { const sig = (0, signal_1.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; }; exports.domSignal = domSignal; // Convenience functions for common DOM operations const bindElement = (element, signal) => { const updateElement = (value) => { element.textContent = String(value); }; updateElement(signal.value()); return signal.subscribe(updateElement); }; exports.bindElement = bindElement; const bindAttribute = (element, attribute, signal) => { const updateAttribute = (value) => { element.setAttribute(attribute, String(value)); }; updateAttribute(signal.value()); return signal.subscribe(updateAttribute); }; exports.bindAttribute = bindAttribute; const bindProperty = (element, property, signal) => { const updateProperty = (value) => { element[property] = value; }; updateProperty(signal.value()); return signal.subscribe(updateProperty); }; exports.bindProperty = bindProperty; 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); }; }; exports.bindEvent = bindEvent; // DOM Block utilities 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 (0, exports.domBlock)(tag, props); }, destroy: () => { children.forEach((child) => child.destroy()); if (element && element.parentNode) { element.parentNode.removeChild(element); } element = null; children = []; }, }; }; exports.domBlock = domBlock; // Reactive DOM block 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; }; exports.reactiveDOMBlock = reactiveDOMBlock; // CRDT DOM synchronization const syncCRDTToDOM = (reactiveCRDT, element, renderer) => { const updateDOM = (value) => { (0, scheduler_1.getGlobalScheduler)().schedule({ id: `crdt-sync-${element.id || 'unknown'}`, priority: scheduler_1.Priority.HIGH, execute: () => renderer(value, element), }); }; // Initial render updateDOM(reactiveCRDT.signal.value()); // Subscribe to changes return reactiveCRDT.subscribe(updateDOM); }; exports.syncCRDTToDOM = syncCRDTToDOM; // Form utilities 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(); }; }; exports.bindFormToSignal = bindFormToSignal; // Event delegation utilities 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); }; }; exports.delegate = delegate; // Animation utilities 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); } }); }; exports.animateElement = animateElement; // Intersection Observer integration 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(); }; }; exports.observeIntersection = observeIntersection; // Resize Observer integration const observeResize = (element, callback) => { const observer = new ResizeObserver((entries) => { entries.forEach(callback); }); observer.observe(element); return () => { observer.unobserve(element); observer.disconnect(); }; }; exports.observeResize = observeResize; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWRhcHRlcnMvZG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUdILDhDQUFtRDtBQUVuRCwrQ0FBK0Q7QUFnQnhELE1BQU0sU0FBUyxHQUFHLENBQUksT0FBVSxFQUFnQixFQUFFO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTVCLE1BQU0sTUFBTSxHQUFpQjtRQUMzQixHQUFHLEdBQUc7UUFFTixhQUFhLEVBQUUsQ0FBQyxPQUFvQixFQUFFLFFBQWdCLEVBQUUsRUFBRTtZQUN4RCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO2dCQUNoQyxPQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLENBQUMsQ0FBQztZQUVGLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzQixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELGVBQWUsRUFBRSxDQUFDLE9BQW9CLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1lBQzNELE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQztZQUVGLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3QixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELGlCQUFpQixFQUFFLENBQUMsT0FBb0IsRUFBRSxFQUFFO1lBQzFDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7Z0JBQzlC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