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