Files
carmanagement/apps/homepage/src/lib/theme/client.ts
T
root fb7b4eefc1
Build & Push / Build & Push Docker Image (push) Failing after 2m50s
Test / Type Check (all packages) (push) Failing after 55s
Test / API Unit Tests (push) Has been skipped
Test / Homepage Unit Tests (push) Has been skipped
Test / Carplace Unit Tests (push) Has been skipped
Test / Admin Unit Tests (push) Has been skipped
Test / Dashboard Unit Tests (push) Has been skipped
Test / API Integration Tests (push) Has been skipped
fix bug#7
2026-07-20 01:01:21 -04:00

45 lines
1.3 KiB
TypeScript

import {
isThemePreference,
resolveTheme,
themeCookie,
themeCookieMaxAgeSeconds,
themeStorageKey,
type ThemePreference,
} from './config';
export const themePreferenceEvent = 'rentaldrivego:theme-preference';
export function applyTheme(preference: ThemePreference): void {
const systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const resolved = resolveTheme(preference, systemDark);
const root = document.documentElement;
root.dataset.themePreference = preference;
root.dataset.theme = resolved;
}
export function persistTheme(preference: ThemePreference): void {
try {
window.localStorage.setItem(themeStorageKey, preference);
} catch {
// Storage can be unavailable; the first-party cookie remains canonical.
}
const secure = window.location.protocol === 'https:' ? '; Secure' : '';
document.cookie =
[
`${themeCookie}=${encodeURIComponent(preference)}`,
'Path=/',
`Max-Age=${themeCookieMaxAgeSeconds}`,
'SameSite=Lax',
].join('; ') + secure;
applyTheme(preference);
window.dispatchEvent(
new CustomEvent<ThemePreference>(themePreferenceEvent, { detail: preference }),
);
}
export function currentThemePreference(): ThemePreference {
const value = document.documentElement.dataset.themePreference;
return isThemePreference(value) ? value : 'dark';
}