Add canonical Person schema and social links to layouts

- Add SOCIAL_LINKS import to BaseLayout and BlogPost
- Add Master Person schema to BaseLayout
- Reference Person @id in BlogPost article schema

Hubert The Eunuch
This commit is contained in:
Nicholai 2025-12-21 01:46:53 -07:00
parent 5b9d4b3a14
commit 861263437c
2 changed files with 49 additions and 13 deletions

View File

@ -5,7 +5,7 @@ import Footer from '../components/Footer.astro';
import GridOverlay from '../components/GridOverlay.astro'; import GridOverlay from '../components/GridOverlay.astro';
import Navigation from '../components/Navigation.astro'; import Navigation from '../components/Navigation.astro';
import CustomCursor from '../components/CustomCursor'; import CustomCursor from '../components/CustomCursor';
import { HTML_MARKER, SITE_TITLE, SITE_DESCRIPTION } from '../consts'; import { HTML_MARKER, SITE_TITLE, SITE_DESCRIPTION, SOCIAL_LINKS } from '../consts';
interface Props { interface Props {
title?: string; title?: string;
@ -17,15 +17,49 @@ interface Props {
modifiedTime?: Date; modifiedTime?: Date;
} }
const { const {
title = SITE_TITLE, title = SITE_TITLE,
description = SITE_DESCRIPTION, description = SITE_DESCRIPTION,
usePadding = true, usePadding = true,
image, image,
type = 'website', type = 'website',
publishedTime, publishedTime,
modifiedTime, modifiedTime,
} = Astro.props; } = Astro.props;
// Master Person schema - establishes canonical identity across all pages
const personSchema = {
"@context": "https://schema.org",
"@type": "Person",
"@id": `${SOCIAL_LINKS.website}/#person`,
"name": "Nicholai Vogel",
"url": SOCIAL_LINKS.website,
"email": SOCIAL_LINKS.email,
"jobTitle": "VFX Supervisor & Technical Artist",
"description": "VFX Supervisor specializing in both 2D and 3D VFX, AI and high-end technical visualization.",
"knowsAbout": [
"Houdini",
"Nuke",
"ComfyUI",
"Python",
"VFX Pipeline",
"Real-time VFX",
"Motion Graphics",
"Technical Art"
],
"sameAs": [
SOCIAL_LINKS.linkedin,
"https://www.instagram.com/nicholai.exe"
],
"affiliation": {
"@type": "Organization",
"name": "Biohazard VFX",
"url": "https://biohazardvfx.com",
"founder": {
"@id": `${SOCIAL_LINKS.website}/#person`
}
}
};
--- ---
<!DOCTYPE html> <!DOCTYPE html>
@ -40,14 +74,18 @@ const {
document.documentElement.setAttribute('data-theme', theme); document.documentElement.setAttribute('data-theme', theme);
})(); })();
</script> </script>
<BaseHead <BaseHead
title={title} title={title}
description={description} description={description}
image={image} image={image}
type={type} type={type}
publishedTime={publishedTime} publishedTime={publishedTime}
modifiedTime={modifiedTime} modifiedTime={modifiedTime}
/> />
<!-- Master Person Schema - Canonical Identity -->
<script type="application/ld+json" set:html={JSON.stringify(personSchema)} />
<slot name="head" /> <slot name="head" />
</head> </head>

View File

@ -8,6 +8,7 @@ import TableOfContents from '../components/TableOfContents.astro';
import PostNavigation from '../components/PostNavigation.astro'; import PostNavigation from '../components/PostNavigation.astro';
import RelatedPosts from '../components/RelatedPosts.astro'; import RelatedPosts from '../components/RelatedPosts.astro';
import { Image } from 'astro:assets'; import { Image } from 'astro:assets';
import { SOCIAL_LINKS } from '../consts';
interface NavPost { interface NavPost {
title: string; title: string;
@ -56,6 +57,7 @@ const {
} = Astro.props; } = Astro.props;
// Article structured data (JSON-LD) // Article structured data (JSON-LD)
// References the canonical Person @id from BaseLayout for knowledge graph linking
const articleSchema = { const articleSchema = {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "Article", "@type": "Article",
@ -64,14 +66,10 @@ const articleSchema = {
"datePublished": pubDate.toISOString(), "datePublished": pubDate.toISOString(),
"dateModified": (updatedDate || pubDate).toISOString(), "dateModified": (updatedDate || pubDate).toISOString(),
"author": { "author": {
"@type": "Person", "@id": `${SOCIAL_LINKS.website}/#person`
"name": "Nicholai Vogel",
"url": "https://nicholai.work"
}, },
"publisher": { "publisher": {
"@type": "Person", "@id": `${SOCIAL_LINKS.website}/#person`
"name": "Nicholai Vogel",
"url": "https://nicholai.work"
}, },
"mainEntityOfPage": { "mainEntityOfPage": {
"@type": "WebPage", "@type": "WebPage",