diff --git a/website/public/favicon-dark.ico b/website/public/favicon-dark.ico
new file mode 100644
index 00000000..342b70ce
Binary files /dev/null and b/website/public/favicon-dark.ico differ
diff --git a/website/public/favicon-dark.svg b/website/public/favicon-dark.svg
new file mode 100644
index 00000000..b6764fc3
--- /dev/null
+++ b/website/public/favicon-dark.svg
@@ -0,0 +1,7 @@
+
diff --git a/website/src/components/ThemeInit.astro b/website/src/components/ThemeInit.astro
index f08bf91f..61a6571c 100644
--- a/website/src/components/ThemeInit.astro
+++ b/website/src/components/ThemeInit.astro
@@ -15,12 +15,27 @@ import { THEME_KEY } from '@/consts';
localStorage[localStorageKey] = 'system';
localStorageValue = 'system';
}
+ let isDark = false;
if (localStorageValue === 'dark') {
document.documentElement.classList.add('dark');
+ isDark = true;
} else if (localStorageValue === 'system') {
if (typeof window.matchMedia !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.classList.add('dark');
+ isDark = true;
}
}
+ const themeColorMeta = document.querySelector('meta[name="theme-color"]');
+ if (themeColorMeta) {
+ themeColorMeta.setAttribute('content', isDark ? '#393836' : '#ebe4c1');
+ }
+ const svgFavicon = document.querySelector('link[rel="icon"][type="image/svg+xml"]');
+ const icoFavicon = document.querySelector('link[rel="icon"][sizes="32x32"]');
+ if (svgFavicon) {
+ svgFavicon.setAttribute('href', isDark ? '/favicon-dark.svg' : '/favicon.svg');
+ }
+ if (icoFavicon) {
+ icoFavicon.setAttribute('href', isDark ? '/favicon-dark.ico' : '/favicon.ico');
+ }
}
diff --git a/website/src/components/ThemeToggle.tsx b/website/src/components/ThemeToggle.tsx
index 0898b651..89aa11a6 100644
--- a/website/src/components/ThemeToggle.tsx
+++ b/website/src/components/ThemeToggle.tsx
@@ -74,11 +74,20 @@ export function ThemeToggle() {
};
}, [preference]);
- // Keep document.documentElement in sync with theme
+ // Keep document.documentElement, theme-color, and favicons in sync with theme
useEffect(() => {
if (typeof document === 'undefined') return;
- if (theme === 'light') document.documentElement.classList.remove('dark');
- else if (theme === 'dark') document.documentElement.classList.add('dark');
+ if (theme === 'light') {
+ document.documentElement.classList.remove('dark');
+ document.querySelector('meta[name="theme-color"]')?.setAttribute('content', '#ebe4c1');
+ document.querySelector('link[rel="icon"][type="image/svg+xml"]')?.setAttribute('href', '/favicon.svg');
+ document.querySelector('link[rel="icon"][sizes="32x32"]')?.setAttribute('href', '/favicon.ico');
+ } else if (theme === 'dark') {
+ document.documentElement.classList.add('dark');
+ document.querySelector('meta[name="theme-color"]')?.setAttribute('content', '#393836');
+ document.querySelector('link[rel="icon"][type="image/svg+xml"]')?.setAttribute('href', '/favicon-dark.svg');
+ document.querySelector('link[rel="icon"][sizes="32x32"]')?.setAttribute('href', '/favicon-dark.ico');
+ }
return () => {
document.documentElement.classList.remove('dark');
diff --git a/website/src/layouts/Base.astro b/website/src/layouts/Base.astro
index 10828ede..6a9e02b9 100644
--- a/website/src/layouts/Base.astro
+++ b/website/src/layouts/Base.astro
@@ -31,6 +31,7 @@ const fullTitle = Array.isArray(title)
{/* Global Metadata */}
+