diff options
Diffstat (limited to 'examples/portfolio/src/components/MainHead.astro')
-rw-r--r-- | examples/portfolio/src/components/MainHead.astro | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/examples/portfolio/src/components/MainHead.astro b/examples/portfolio/src/components/MainHead.astro new file mode 100644 index 000000000..b4c7263ff --- /dev/null +++ b/examples/portfolio/src/components/MainHead.astro @@ -0,0 +1,47 @@ +--- +import '../styles/global.css'; + +interface Props { + title?: string | undefined; + description?: string | undefined; +} + +const { + title = 'Jeanine White: Personal Site', + description = 'The personal site of Jeanine White', +} = Astro.props; +--- + +<meta charset="UTF-8" /> +<meta name="description" property="og:description" content={description} /> +<meta name="viewport" content="width=device-width" /> +<meta name="generator" content={Astro.generator} /> +<title>{title}</title> + +<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> +<link rel="preconnect" href="https://fonts.googleapis.com" /> +<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> +<link + href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,400;0,700;1,400&family=Rubik:wght@500;600&display=swap" + rel="stylesheet" +/> +<script is:inline> + // This code is inlined in the head to make dark mode instant & blocking. + const getThemePreference = () => { + if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) { + return localStorage.getItem('theme'); + } + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + }; + const isDark = getThemePreference() === 'dark'; + document.documentElement.classList[isDark ? 'add' : 'remove']('theme-dark'); + + if (typeof localStorage !== 'undefined') { + // Watch the document element and persist user preference when it changes. + const observer = new MutationObserver(() => { + const isDark = document.documentElement.classList.contains('theme-dark'); + localStorage.setItem('theme', isDark ? 'dark' : 'light'); + }); + observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); + } +</script> |