export const generate_screen_css = component_arr => { let styles = "" for (const { _styles, _id, _children, _component } of component_arr) { let [componentName] = _component.match(/[a-z]*$/) Object.keys(_styles).forEach(selector => { const cssString = generate_css(_styles[selector]) if (cssString) { styles += apply_class(_id, componentName, cssString, selector) } }) if (_children && _children.length) { styles += generate_screen_css(_children) + "\n" } } return styles.trim() } export const generate_css = style => { let cssString = Object.entries(style).reduce((str, [key, value]) => { if (typeof value === "string") { if (value) { return (str += `${key}: ${value};\n`) } } else if (Array.isArray(value)) { if (value.length > 0 && !value.every(v => v === "")) { return (str += `${key}: ${value.join(" ")};\n`) } } return str }, "") return (cssString || "").trim() } export const apply_class = (id, name = "element", styles, selector) => { if (selector === "normal") { return `.${name}-${id} {\n${styles}\n}` } else { let sel = selector === "selected" ? "::selection" : `:${selector}` return `.${name}-${id}${sel} {\n${styles}\n}` } }