1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-11-14 23:20:51 -05:00

json-ld improvements

This commit is contained in:
2025-03-21 12:02:14 -04:00
parent b626955731
commit 9fd3de8569
20 changed files with 277 additions and 225 deletions

View File

@@ -1,4 +1,5 @@
import clsx from "clsx";
import { JsonLd } from "react-schemaorg";
import Analytics from "./analytics";
import { ThemeProvider } from "../contexts/ThemeContext";
import Header from "../components/Header";
@@ -8,7 +9,7 @@ import * as config from "../lib/config";
import { BASE_URL, MAX_WIDTH } from "../lib/config/constants";
import defaultMetadata from "../lib/config/metadata";
import type { Metadata } from "next";
import type { Person, WithContext } from "schema-dts";
import type { Person, WebSite } from "schema-dts";
import { GeistMono, GeistSans } from "../lib/styles/fonts";
import "modern-normalize/modern-normalize.css"; // https://github.com/sindresorhus/modern-normalize/blob/main/modern-normalize.css
@@ -21,35 +22,52 @@ import ogImage from "./opengraph-image.jpg";
export const metadata: Metadata = defaultMetadata;
// https://nextjs.org/docs/app/building-your-application/optimizing/metadata#json-ld
const jsonLd: WithContext<Person> = {
"@context": "https://schema.org",
"@type": "Person",
name: config.authorName,
url: BASE_URL,
image: `${BASE_URL}${ogImage.src}`,
sameAs: [
BASE_URL,
`https://github.com/${config.authorSocial?.github}`,
`https://keybase.io/${config.authorSocial?.keybase}`,
`https://twitter.com/${config.authorSocial?.twitter}`,
`https://medium.com/@${config.authorSocial?.medium}`,
`https://www.linkedin.com/in/${config.authorSocial?.linkedin}/`,
`https://www.facebook.com/${config.authorSocial?.facebook}`,
`https://www.instagram.com/${config.authorSocial?.instagram}/`,
`https://${config.authorSocial?.mastodon}`,
`https://bsky.app/profile/${config.authorSocial?.bluesky}`,
],
};
const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
return (
<html lang={config.siteLocale} suppressHydrationWarning>
<head>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
<JsonLd<Person>
item={{
"@context": "https://schema.org",
"@type": "Person",
"@id": `${BASE_URL}/#person`,
name: config.authorName,
url: BASE_URL,
image: `${BASE_URL}${ogImage.src}`,
sameAs: [
BASE_URL,
`https://github.com/${config.authorSocial?.github}`,
`https://keybase.io/${config.authorSocial?.keybase}`,
`https://twitter.com/${config.authorSocial?.twitter}`,
`https://medium.com/@${config.authorSocial?.medium}`,
`https://www.linkedin.com/in/${config.authorSocial?.linkedin}/`,
`https://www.facebook.com/${config.authorSocial?.facebook}`,
`https://www.instagram.com/${config.authorSocial?.instagram}/`,
`https://${config.authorSocial?.mastodon}`,
`https://bsky.app/profile/${config.authorSocial?.bluesky}`,
],
}}
/>
<JsonLd<WebSite>
item={{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": `${BASE_URL}/#website`,
name: config.siteName,
url: BASE_URL,
author: config.authorName,
description: config.longDescription,
inLanguage: config.siteLocale,
license: config.licenseUrl,
}}
/>
</head>
<body className={clsx(GeistMono.variable, GeistSans.variable)}>
<body
className={clsx(GeistMono.variable, GeistSans.variable)}
style={{ ["--max-width" as string]: `${MAX_WIDTH}px` }}
>
<ThemeProvider>
<SkipToContentLink />
@@ -58,9 +76,7 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
<main className={styles.default}>
<SkipToContentTarget />
<div className={styles.container} style={{ maxWidth: MAX_WIDTH }}>
{children}
</div>
<div className={styles.container}>{children}</div>
</main>
<Footer />