feat: update theme preference handling in ThemeService and index.html

This commit is contained in:
nessar committed 2026-08-17 14:18:15 +02:00
1 parent c8020c489e
commit 45de0cebcc
3 files changed
+44 -15

No files matched your search

@@ -3,9 +3,26 @@ import { vi } from 'vitest';
import { ThemeService } from './theme.service';
describe('ThemeService', () => {
beforeEach(() => localStorage.clear());
it('defaults to the operating-system preference', () => {
vi.stubGlobal(
'matchMedia',
vi.fn(() => ({ matches: true, addEventListener: vi.fn() })),
);
const service = TestBed.inject(ThemeService);
TestBed.tick();
expect(service.preference()).toBe('system');
expect(document.documentElement.dataset['theme']).toBe('dark');
});
it('persists explicit and system preferences', () => {
const listener = vi.fn();
vi.stubGlobal('matchMedia', vi.fn(() => ({ matches: true, addEventListener: listener })));
vi.stubGlobal(
'matchMedia',
vi.fn(() => ({ matches: true, addEventListener: listener })),
);
localStorage.setItem('lmnp-theme', 'system');
const service = TestBed.inject(ThemeService);
TestBed.tick();
+1 -1
View File
@@ -40,6 +40,6 @@ export class ThemeService {
const storedPreference = localStorage.getItem(THEME_STORAGE_KEY);
return storedPreference === 'dark' || storedPreference === 'system'
? storedPreference
: 'light';
: 'system';
}
}
+25 -13
View File
@@ -1,16 +1,28 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>LmnpFrontend</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script>
try {
const preference = localStorage.getItem('lmnp-theme');
const theme =
preference === 'light' || preference === 'dark'
? preference
: matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light';
document.documentElement.dataset.theme = theme;
document.documentElement.dataset.themePreference =
preference === 'light' || preference === 'dark' ? preference : 'system';
} catch {}
</script>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
</head>
<head>
<meta charset="utf-8">
<title>LmnpFrontend</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
<body>
<app-root></app-root>
</body>
</html>