UNPKG

@web-atoms/core

Version:
78 lines (71 loc) 2.64 kB
import { AtomStyleRules } from "../../style/StyleRule"; import { IStyleDeclaration } from "./IStyleDeclaration"; let styleId = 1; function fromCamelToHyphen(input: string): string { return input.replace( /([a-z])([A-Z])/g, "$1-$2" ).toLowerCase(); } function createStyleText(name: string, styles: IStyleDeclaration): string[] { const styleList: any[] = []; const subclasses = []; for (const key in styles) { if (styles.hasOwnProperty(key)) { if (/^(\_\$\_|className$|toString$)/i.test(key)) { continue; } const element = styles[key]; if (element === undefined || element === null) { continue; } const keyName = fromCamelToHyphen(key); if (key === "subclasses") { const n = name; for (const subclassKey in element) { if (element.hasOwnProperty(subclassKey)) { const ve = element[subclassKey]; subclasses.push( ... createStyleText(`${n}${subclassKey}`, ve)); } } } else { if (element.url) { styleList.push(`${keyName}: url(${element})`); } else { styleList.push(`${keyName}: ${element}`); } } } } const cname = fromCamelToHyphen(name); const styleClassName = `${cname}`; if (styleList.length) { return [`${styleClassName} {\r\n${styleList.join(";\r\n")}; }`, ... subclasses]; } return subclasses; } /** * It will add custom stylesheet to the document and * it will create a new unique scope class if selectorName was not provided * @param style AtomStyleRules | IStyleDeclaration * @param selectorName name of the selector (only use for CustomElement, do not use for components) * @returns string */ export default function CSS(style: IStyleDeclaration | AtomStyleRules, selectorName?: string): string { let styleName = ""; if (style instanceof AtomStyleRules) { styleName = style.name || ""; if (styleName) { styleName = "-" + styleName; } style = style.style; } let className = selectorName; if (!selectorName) { className = `wa-style-${styleId++}${styleName}`; selectorName = `.${className}`; } const s = document.createElement("style"); s.id = selectorName; const list = createStyleText(selectorName, style); s.textContent = list.join("\r\n"); document.head.appendChild(s); return className; }