Move useCssVariable into ui package

This commit is contained in:
Gregor Vostrak
2026-03-23 19:02:20 +01:00
parent bd3b8f265f
commit b94a04dca0
9 changed files with 8 additions and 7 deletions

View File

@@ -11,7 +11,7 @@ import {
onUnmounted,
} from 'vue';
import { useLocalStorage } from '@vueuse/core';
import { useCssVariable } from '@/utils/useCssVariable';
import { useCssVariable } from '../utils/useCssVariable';
import { getLocalizedDayJs } from '../utils/time';
import { LoadingSpinner, TimeEntryCreateModal, TimeEntryEditModal } from '..';
import FullCalendarDayHeader from './FullCalendarDayHeader.vue';

View File

@@ -20,6 +20,7 @@ export type { FieldVariants } from './field/index';
export type { CalendarSettings } from './FullCalendar/calendarSettings';
export type { ActivityPeriod } from './FullCalendar/activityTypes';
export { cn } from './utils/cn';
export { useCssVariable } from './utils/useCssVariable';
import Badge from './Badge.vue';
import Button from './Buttons/Button.vue';

View File

@@ -0,0 +1,49 @@
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;
}