diff --git a/css.js b/css.js new file mode 100644 index 0000000..9ee9ed0 --- /dev/null +++ b/css.js @@ -0,0 +1,32 @@ +const diversify = (prefix, now, ...rest) => + now + ? now.split(/, */g).map(current => diversify(prefix+' '+current, ...rest)).join(",") + : prefix + +const walkStyles = (styles, trail=[], buffer=[]) => { + let inner + const position = buffer.push(undefined)-1 + Object.entries(styles).forEach(([name, children]) => { + if (children.constructor.name === "Object") { + trail.push(name) + walkStyles(children, trail, buffer) + trail.pop() + } else { + inner ||= [] + const rules = Array.isArray(children) + ? children.map(e => Array.isArray(e) ? e.map(e => e.toString()).join(' ') : e.toString()).join(", ") + : children.toString() + inner.push(`${name}: ${children}`) + } + }) + if (inner) buffer[position] = (`${diversify("", ...trail)} {${inner.join("; ")}}`) + return buffer +} + +export const css = (styles) => walkStyles(styles).filter(e=>e).join("\n") + +export const style = styles => { + const style = document.createElement("style") + style.innerHTML = css(styles) + return style +}