I’m using Svelte with DaisyUI and need to retrieve the current theme colors dynamically. I rely on these colors in chroma-js
, so it’s crucial to get them correctly. The code below works for me, but it feels like there might be a more efficient or idiomatic way to achieve this. Is this the only/best approach to get the current theme colors from DaisyUI?
Here’s the relevant code snippet:
<script lang="ts">
import { onMount } from 'svelte';
import { theme } from '$stores/global';
import type { ThemeColor, ThemeColorMap } from "$type/shared";
type ColorElement = {
[key in ThemeColor]?: HTMLDivElement | undefined;
};
export let colors: ThemeColorMap;
const colorKeys: ThemeColor[] = ['accent', 'info', 'neutral'];
let colorElements: ColorElement = {} as ColorElement; // This will store references to the div elements
function getColors(): ThemeColorMap {
if (typeof window === 'undefined') {
return {};
}
let newColors: ThemeColorMap = {};
Object.entries(colorElements).forEach(([key, element]) => {
if (element) {
newColors[key as ThemeColor] = getComputedStyle(element).backgroundColor;
}
});
return newColors;
}
onMount(() => {
colors = getColors();
});
theme.subscribe(() => {
colors = getColors();
});
</script>
<div class="hidden">
{#each colorKeys as key}
<div class="bg-{key}" bind:this={colorElements[key]}></div>
{/each}
</div>
This approach creates hidden div
elements with DaisyUI color classes, and then I use getComputedStyle
to extract the background color from these elements.
While this works, it feels a bit hacky, especially with the hidden elements. Is there a more direct or efficient way to access the current DaisyUI theme colors in Svelte, particularly for use with chroma-js
?
Any suggestions would be appreciated!