flyonui
Version:
The easiest, free and open-source Tailwind CSS component library with semantic classes.
49 lines (42 loc) • 1.27 kB
JavaScript
import { plugin } from '../functions/plugin.js'
import allThemes from './object.js'
export default plugin.withOptions((options = {}) => {
return ({ addBase }) => {
const {
name = 'custom-theme',
default: isDefault = false,
prefersdark = false,
'color-scheme': colorScheme = 'normal',
root = ':root',
...customThemeTokens
} = options
let selector = `${root}:has(input.theme-controller[value=${name}]:checked),[data-theme="${name}"]`
if (isDefault) {
selector = `:where(${root}),${selector}`
}
// Merge custom theme with built-in theme if it exists
let themeTokens = { ...customThemeTokens }
if (allThemes[name]) {
const builtinTheme = allThemes[name]
themeTokens = {
...builtinTheme,
...customThemeTokens,
'color-scheme': colorScheme || builtinTheme.colorScheme
}
}
const baseStyles = {
[selector]: {
'color-scheme': themeTokens['color-scheme'] || colorScheme,
...themeTokens
}
}
if (prefersdark) {
addBase({
'@media (prefers-color-scheme: dark)': {
[root]: baseStyles[selector] // Use the configurable root option here
}
})
}
addBase(baseStyles)
}
})