From a26b775b7bbf1abd3e99c8bf9ce4c7522d3a0adc Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Wed, 19 Jan 2022 13:56:34 +0100
Subject: chore: add structured data using schema.org and JSON-LD

I also added the featured image on single article.
---
 src/components/Branding/Branding.tsx | 63 ++++++++++++++++++++++++------------
 1 file changed, 42 insertions(+), 21 deletions(-)

(limited to 'src/components/Branding/Branding.tsx')

diff --git a/src/components/Branding/Branding.tsx b/src/components/Branding/Branding.tsx
index 9421314..5e2cf6a 100644
--- a/src/components/Branding/Branding.tsx
+++ b/src/components/Branding/Branding.tsx
@@ -6,36 +6,57 @@ import photo from '@assets/images/armand-philippot.jpg';
 import Logo from '@assets/images/armand-philippot-logo.svg';
 import { config } from '@config/website';
 import styles from './Branding.module.scss';
+import Head from 'next/head';
+import { Person, WithContext } from 'schema-dts';
 
 type BrandingReturn = ({ isHome }: { isHome: boolean }) => ReactElement;
 
 const Branding: BrandingReturn = ({ isHome = false }) => {
   const TitleTag = isHome ? 'h1' : 'p';
 
+  const schemaJsonLd: WithContext<Person> = {
+    '@context': 'https://schema.org',
+    '@type': 'Person',
+    '@id': `${config.url}/#branding`,
+    name: config.name,
+    url: config.url,
+    jobTitle: config.baseline,
+    image: photo.src,
+    subjectOf: { '@id': `${config.url}` },
+  };
+
   return (
-    <div className={styles.wrapper}>
-      <div className={styles.logo}>
-        <div className={styles.logo__front}>
-          <Image
-            src={photo}
-            alt={t({
-              message: `${config.name} picture`,
-              comment: 'Branding logo.',
-            })}
-            layout="responsive"
-          />
-        </div>
-        <div className={styles.logo__back}>
-          <Logo />
+    <>
+      <Head>
+        <script
+          type="application/ld+json"
+          dangerouslySetInnerHTML={{ __html: JSON.stringify(schemaJsonLd) }}
+        ></script>
+      </Head>
+      <div id="branding" className={styles.wrapper}>
+        <div className={styles.logo}>
+          <div className={styles.logo__front}>
+            <Image
+              src={photo}
+              alt={t({
+                message: `${config.name} picture`,
+                comment: 'Branding logo.',
+              })}
+              layout="responsive"
+            />
+          </div>
+          <div className={styles.logo__back}>
+            <Logo />
+          </div>
         </div>
+        <TitleTag className={styles.name}>
+          <Link href="/">
+            <a className={styles.link}>{config.name}</a>
+          </Link>
+        </TitleTag>
+        <p className={styles.job}>{config.baseline}</p>
       </div>
-      <TitleTag className={styles.name}>
-        <Link href="/">
-          <a className={styles.link}>{config.name}</a>
-        </Link>
-      </TitleTag>
-      <p className={styles.job}>{config.baseline}</p>
-    </div>
+    </>
   );
 };
 
-- 
cgit v1.2.3

