Files
solidtime/resources/js/utils/useCssVariable.ts

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