mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-05-07 20:32:26 +00:00
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { ref, onMounted, onUnmounted } from 'vue';
|
|
|
|
export function useCssVariable(variableName: string) {
|
|
const value = ref('');
|
|
let observer: MutationObserver | null = null;
|
|
let mediaQuery: MediaQueryList | null = null;
|
|
|
|
const updateValue = () => {
|
|
const computedStyle = getComputedStyle(document.documentElement);
|
|
const cssValue = computedStyle.getPropertyValue(variableName).trim();
|
|
value.value = cssValue;
|
|
};
|
|
|
|
onMounted(() => {
|
|
// Initialize with current value
|
|
updateValue();
|
|
|
|
// Watch for class changes on document.documentElement (where theme classes are applied)
|
|
observer = new MutationObserver((mutations) => {
|
|
mutations.forEach((mutation) => {
|
|
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
|
|
updateValue();
|
|
}
|
|
});
|
|
});
|
|
|
|
observer.observe(document.documentElement, {
|
|
attributes: true,
|
|
attributeFilter: ['class'],
|
|
});
|
|
|
|
// Also watch for system color scheme changes
|
|
if (window.matchMedia) {
|
|
mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
mediaQuery.addEventListener('change', updateValue);
|
|
}
|
|
});
|
|
|
|
onUnmounted(() => {
|
|
if (observer) {
|
|
observer.disconnect();
|
|
}
|
|
if (mediaQuery) {
|
|
mediaQuery.removeEventListener('change', updateValue);
|
|
}
|
|
});
|
|
|
|
return value;
|
|
}
|