rvx
Version:
A signal based rendering library
37 lines (33 loc) • 1.03 kB
text/typescript
import type { StyleValue } from "../element-common.js";
import { watch } from "../signals.js";
type StyleHandler = (name: string, value: unknown) => void;
function watchStyle(value: StyleValue, handler: StyleHandler): void {
watch(value, value => {
if (Array.isArray(value)) {
const overwrites: string[][] = [];
for (let i = value.length - 1; i >= 0; i--) {
const self: string[] = [];
overwrites[i] = self;
watchStyle(value[i], (name, value) => {
if (!self.includes(name)) {
self.push(name);
}
for (let o = i + 1; o < overwrites.length; o++) {
if (overwrites[o].includes(name)) {
return;
}
}
handler(name, value);
});
}
} else if (value) {
for (const name in value) {
watch(value[name]!, value => handler(name, value));
}
}
});
}
export function setStyle(elem: Element, value: StyleValue): void {
const style = (elem as HTMLElement).style;
watchStyle(value, (name, value) => style.setProperty(name, value ? String(value) : null));
}