import toStr from 'licia/toStr' import each from 'licia/each' import filter from 'licia/filter' import isStr from 'licia/isStr' import keys from 'licia/keys' import kebabCase from 'licia/kebabCase' import defaults from 'licia/defaults' import themes from './themes' let styleList = [] let scale = 1 let curTheme = themes.Light const exports = function (css, container) { css = toStr(css) for (let i = 0, len = styleList.length; i < len; i++) { if (styleList[i].css === css) return } container = container || exports.container || document.head const el = document.createElement('style') el.type = 'text/css' container.appendChild(el) const style = { css, el, container } resetStyle(style) styleList.push(style) return style } exports.setScale = function (s) { scale = s resetStyles() } exports.setTheme = function (theme) { if (isStr(theme)) { curTheme = themes[theme] || themes.Light } else { curTheme = defaults(theme, themes.Light) } resetStyles() } exports.getCurTheme = () => curTheme exports.getThemes = () => themes exports.clear = function () { each(styleList, ({ container, el }) => container.removeChild(el)) styleList = [] } exports.remove = function (style) { styleList = filter(styleList, (s) => s !== style) style.container.removeChild(style.el) } function resetStyles() { each(styleList, (style) => resetStyle(style)) } function resetStyle({ css, el }) { css = css.replace(/(\d+)px/g, ($0, $1) => +$1 * scale + 'px') css = css.replace(/_/g, 'eruda-') const _keys = keys(themes.Light) each(_keys, (key) => { css = css.replace( new RegExp(`var\\(--${kebabCase(key)}\\)`, 'g'), curTheme[key] ) }) el.innerText = css } export default exports