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