@benev/slate
Version:
frontend web stuff
54 lines • 1.94 kB
JavaScript
export function attributes(element, spec) {
Attributes.on_change(element, () => element.requestUpdate());
return Attributes.proxy(element, spec);
}
export var Attributes;
(function (Attributes) {
Attributes.proxy = (element, spec) => new Proxy(spec, {
get: (_target, name) => {
const type = spec[name];
const raw = element.getAttribute(name);
switch (type) {
case String:
return raw ?? undefined;
case Number:
return raw !== null
? Number(raw)
: undefined;
case Boolean:
return raw !== null;
default:
throw new Error(`invalid attribute type for "${name}"`);
}
},
set: (_target, name, value) => {
const type = spec[name];
switch (type) {
case String: {
element.setAttribute(name, value);
return true;
}
case Number: {
element.setAttribute(name, value.toString());
return true;
}
case Boolean: {
if (value)
element.setAttribute(name, "");
else
element.removeAttribute(name);
return true;
}
default:
throw new Error(`invalid attribute type for "${name}"`);
}
},
});
function on_change(element, handle_change) {
const observer = new MutationObserver(handle_change);
observer.observe(element, { attributes: true });
return () => observer.disconnect();
}
Attributes.on_change = on_change;
})(Attributes || (Attributes = {}));
//# sourceMappingURL=attributes.js.map