| 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 |
|
|