96 lines
3.3 KiB
Plaintext
96 lines
3.3 KiB
Plaintext
---
|
|
import { getImage } from 'astro:assets';
|
|
import { readSingleton } from '@directus/sdk';
|
|
|
|
import directus from '@lib/directus';
|
|
import brandSrc from '@images/brand_logo.png';
|
|
import faviconSvgSrc from '@images/favicon_icon.svg';
|
|
import faviconSrc from '@images/favicon_icon.png';
|
|
import { SEO } from '@/config';
|
|
|
|
interface Props {
|
|
title: string;
|
|
description: string;
|
|
ogImage?: any;
|
|
ogTitle?: string;
|
|
ogDescription?: string;
|
|
structuredData?: object;
|
|
}
|
|
|
|
const canonicalURL = Astro.url.href;
|
|
let {
|
|
title,
|
|
description,
|
|
ogImage,
|
|
ogTitle = title,
|
|
ogDescription = description,
|
|
structuredData = SEO.structuredData,
|
|
} = Astro.props;
|
|
|
|
let card = 'summary_large_image';
|
|
if (!ogImage) {
|
|
ogImage = brandSrc;
|
|
card = 'summary';
|
|
}
|
|
|
|
const global = await directus.request(readSingleton('site_global'));
|
|
|
|
const faviconSvg = await getImage({ src: faviconSvgSrc, format: 'svg' });
|
|
const appleTouchIcon = await getImage({ src: faviconSrc, width: 180, height: 180, format: 'png' });
|
|
const socialImageRes = await getImage({ src: ogImage, width: 1200, height: 600 });
|
|
|
|
let socialImage = socialImageRes.src;
|
|
if (!socialImage.startsWith('http')) {
|
|
socialImage = Astro.url.origin + socialImageRes.src;
|
|
}
|
|
---
|
|
|
|
<!-- Inject structured data https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data -->{
|
|
structuredData && <script type="application/ld+json" set:html={JSON.stringify(structuredData)} />
|
|
}
|
|
|
|
<!-- Global Metadata -->
|
|
<meta name="title" content={title} />
|
|
<meta name="description" content={description} />
|
|
<meta charset="utf-8" />
|
|
<meta name="web_author" content={global.name} />
|
|
<meta
|
|
name="viewport"
|
|
content="width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0"
|
|
/>
|
|
<meta name="generator" content={Astro.generator} />
|
|
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
<meta name="theme-color" content="#facc15" />
|
|
|
|
<!-- Open Graph -->
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:locale" content="en_US" />
|
|
<meta property="og:url" content={Astro.url} />
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:title" content={ogTitle} />
|
|
<meta property="og:site_name" content={global.name} />
|
|
<meta property="og:description" content={ogDescription} />
|
|
<meta property="og:image" content={socialImage} />
|
|
<meta content="1200" property="og:image:width" />
|
|
<meta content="600" property="og:image:height" />
|
|
<meta content="image/png" property="og:image:type" />
|
|
|
|
<!-- Twitter -->
|
|
<meta property="twitter:card" content={card} />
|
|
<meta property="twitter:url" content={Astro.url} />
|
|
<meta property="twitter:domain" content={Astro.url} />
|
|
<meta property="twitter:title" content={ogTitle} />
|
|
<meta property="twitter:description" content={ogDescription} />
|
|
<meta property="twitter:image" content={socialImage} />
|
|
|
|
<!-- Links -->
|
|
<link href={canonicalURL} rel="canonical" />
|
|
<link rel="sitemap" href="/sitemap-index.xml" />
|
|
<!--<link href="/manifest.json" rel="manifest" />-->
|
|
<link href="/favicon.ico" rel="icon" sizes="any" type="image/x-icon" />
|
|
<link href={faviconSvg.src} rel="icon" type="image/svg+xml" sizes="any" />
|
|
<link href={appleTouchIcon.src} rel="apple-touch-icon" />
|
|
<link href={appleTouchIcon.src} rel="shortcut icon" />
|
|
<link rel="preconnect" href="https://461ZQ3AX3S-dsn.algolia.net" crossorigin />
|