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 />
 |