Files
Eidolon/src/components/SeoHead.astro
T

42 lines
1.5 KiB
Plaintext
Raw Normal View History

2026-08-12 01:11:32 +08:00
---
import { siteConfig } from '@/site.config';
import { getWebmentionEndpoint } from '@/lib/webmentions';
2026-08-12 01:11:32 +08:00
interface Props {
title?: string;
description?: string;
image?: string;
type?: 'website' | 'article';
noindex?: boolean;
webmention?: boolean;
2026-08-12 01:11:32 +08:00
}
const {
title,
description = siteConfig.site.description,
image,
type = 'website',
noindex = false,
webmention = false
2026-08-12 01:11:32 +08:00
} = Astro.props;
const pageTitle = title ? `${title} - ${siteConfig.site.title}` : siteConfig.site.title;
const canonical = new URL(Astro.url.pathname, siteConfig.site.url);
const imageUrl = image ? new URL(image, siteConfig.site.url) : undefined;
const webmentionEndpoint = webmention && siteConfig.webmentions.enabled && siteConfig.webmentions.endpoint.trim()
? getWebmentionEndpoint(siteConfig.webmentions.endpoint, 'receive')
: undefined;
2026-08-12 01:11:32 +08:00
---
<title>{pageTitle}</title>
<meta name="description" content={description} />
<link rel="canonical" href={canonical} />
{webmentionEndpoint && <link rel="webmention" href={webmentionEndpoint} />}
2026-08-12 01:11:32 +08:00
<meta property="og:type" content={type} />
<meta property="og:title" content={pageTitle} />
<meta property="og:description" content={description} />
<meta property="og:url" content={canonical} />
<meta property="og:site_name" content={siteConfig.site.title} />
{imageUrl && <meta property="og:image" content={imageUrl} />}
<meta name="twitter:card" content={imageUrl ? 'summary_large_image' : 'summary'} />
{noindex && <meta name="robots" content="noindex, nofollow" />}