66 lines
1.8 KiB
JavaScript
66 lines
1.8 KiB
JavaScript
import { derived } from "svelte/store"
|
|
import { appStore } from "./app"
|
|
import { builderStore } from "./builder"
|
|
|
|
// This is the good old acorn bug where having the word "g l o b a l" makes it
|
|
// think that this is not ES6 compatible and starts throwing errors when using
|
|
// optional chaining. Piss off acorn.
|
|
const defaultTheme = "spectrum--light"
|
|
const defaultCustomTheme = {
|
|
primaryColor: "var(--spectrum-glo" + "bal-color-blue-600)",
|
|
primaryColorHover: "var(--spectrum-glo" + "bal-color-blue-500)",
|
|
buttonBorderRadius: "16px",
|
|
navBackground: "var(--spectrum-glo" + "bal-color-gray-100)",
|
|
navTextColor: "var(--spectrum-glo" + "bal-color-gray-800)",
|
|
}
|
|
|
|
const createThemeStore = () => {
|
|
const store = derived(
|
|
[builderStore, appStore],
|
|
([$builderStore, $appStore]) => {
|
|
let theme = $appStore.application?.theme
|
|
let customTheme = $appStore.application?.customTheme
|
|
if ($builderStore.inBuilder) {
|
|
theme = $builderStore.theme
|
|
customTheme = $builderStore.customTheme
|
|
}
|
|
|
|
// Ensure theme is set
|
|
theme = theme || defaultTheme
|
|
|
|
// Delete and nullish keys from the custom theme
|
|
if (customTheme) {
|
|
Object.entries(customTheme).forEach(([key, value]) => {
|
|
if (value == null || value === "") {
|
|
delete customTheme[key]
|
|
}
|
|
})
|
|
}
|
|
|
|
// Merge custom theme with defaults
|
|
customTheme = {
|
|
...defaultCustomTheme,
|
|
...customTheme,
|
|
}
|
|
|
|
// Build CSS string setting all custom variables
|
|
let customThemeCss = ""
|
|
Object.entries(customTheme).forEach(([key, value]) => {
|
|
customThemeCss += `--${key}:${value};`
|
|
})
|
|
|
|
return {
|
|
theme,
|
|
customTheme,
|
|
customThemeCss,
|
|
}
|
|
}
|
|
)
|
|
|
|
return {
|
|
subscribe: store.subscribe,
|
|
}
|
|
}
|
|
|
|
export const themeStore = createThemeStore()
|