diff --git a/public/images/friends/dominic_petrarca.png b/public/images/friends/dominic_petrarca.png new file mode 100644 index 0000000..f12fe75 Binary files /dev/null and b/public/images/friends/dominic_petrarca.png differ diff --git a/public/images/friends/jenn_johnsey.png b/public/images/friends/jenn_johnsey.png new file mode 100644 index 0000000..d60f9c2 Binary files /dev/null and b/public/images/friends/jenn_johnsey.png differ diff --git a/public/images/friends/kieran_klukas.png b/public/images/friends/kieran_klukas.png new file mode 100644 index 0000000..ac93641 Binary files /dev/null and b/public/images/friends/kieran_klukas.png differ diff --git a/public/images/friends/logan_lambert.png b/public/images/friends/logan_lambert.png new file mode 100644 index 0000000..dabeb52 Binary files /dev/null and b/public/images/friends/logan_lambert.png differ diff --git a/public/images/friends/maclean_dunkin.png b/public/images/friends/maclean_dunkin.png new file mode 100644 index 0000000..afd92b7 Binary files /dev/null and b/public/images/friends/maclean_dunkin.png differ diff --git a/public/images/friends/ryan_di_lorenzo.png b/public/images/friends/ryan_di_lorenzo.png new file mode 100644 index 0000000..a30dd86 Binary files /dev/null and b/public/images/friends/ryan_di_lorenzo.png differ diff --git a/public/images/friends/samantha_miel.png b/public/images/friends/samantha_miel.png new file mode 100644 index 0000000..94f02d2 Binary files /dev/null and b/public/images/friends/samantha_miel.png differ diff --git a/public/images/friends/theo_reid.png b/public/images/friends/theo_reid.png new file mode 100644 index 0000000..a10c034 Binary files /dev/null and b/public/images/friends/theo_reid.png differ diff --git a/public/sitemap.xml b/public/sitemap.xml index 4045286..d6f6257 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,23 +1,27 @@ -https://jaspermayone.com2026-03-24T03:47:29.255Zweekly1 -https://jaspermayone.com/colophon2026-03-24T03:47:29.256Zweekly0.7 -https://jaspermayone.com/concerts2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/contact2026-03-24T03:47:29.256Zweekly1 -https://jaspermayone.com/elsewhere2026-03-24T03:47:29.256Zweekly0.7 -https://jaspermayone.com/green2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/hardware2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/keys/gpg2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/keys/ssh2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/now2026-03-24T03:47:29.256Zweekly0.7 -https://jaspermayone.com/open-source2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/panera2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/pfp2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/podroll2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/portfolio2026-03-24T03:47:29.256Zweekly1 -https://jaspermayone.com/slashes2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/support-me2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/to2026-03-24T03:47:29.256Zmonthly0.5 -https://jaspermayone.com/uses2026-03-24T03:47:29.256Zweekly0.7 -https://jaspermayone.com/verify2026-03-24T03:47:29.256Zmonthly0.5 +https://jaspermayone.com2026-08-13T00:50:32.196Zweekly1 +https://jaspermayone.com/colophon2026-08-13T00:50:32.196Zweekly0.7 +https://jaspermayone.com/concerts2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/conferences2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/contact2026-08-13T00:50:32.196Zweekly1 +https://jaspermayone.com/elsewhere2026-08-13T00:50:32.196Zweekly0.7 +https://jaspermayone.com/friends2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/green2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/hackathons2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/hardware2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/keys/gpg2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/keys/ssh2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/now2026-08-13T00:50:32.196Zweekly0.7 +https://jaspermayone.com/open-source2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/opengraph-image2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/panera2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/pfp2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/podroll2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/portfolio2026-08-13T00:50:32.196Zweekly1 +https://jaspermayone.com/slashes2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/support-me2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/to2026-08-13T00:50:32.196Zmonthly0.5 +https://jaspermayone.com/uses2026-08-13T00:50:32.196Zweekly0.7 +https://jaspermayone.com/verify2026-08-13T00:50:32.196Zmonthly0.5 \ No newline at end of file diff --git a/src/app/friends/page.tsx b/src/app/friends/page.tsx new file mode 100644 index 0000000..05f339a --- /dev/null +++ b/src/app/friends/page.tsx @@ -0,0 +1,156 @@ +import ExternalLink from "@/components/ExternalLink"; +import FOOTER from "@/components/FOOTER"; +import MENU from "@/components/MENU"; +import { friends, siteUrl } from "@/lib/defs"; +import { safeJsonLd } from "@/lib/jsonld"; +import { Metadata } from "next"; +import Image from "next/image"; +import Script from "next/script"; + +export const metadata: Metadata = { + title: "Friends", + description: + "Some of the super cool people I have the privilege to call friends.", + alternates: { + canonical: "https://jaspermayone.com/friends", + }, +}; + +const friendsPageSchema = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "WebPage", + "@id": "https://jaspermayone.com/friends#webpage", + url: "https://jaspermayone.com/friends", + name: "Friends - Jasper Mayone", + description: + "Some of the super cool people I have the privilege to call friends.", + isPartOf: { + "@id": "https://jaspermayone.com/#website", + }, + about: { + "@id": "https://jaspermayone.com/#person", + }, + mainEntity: { + "@id": "https://jaspermayone.com/friends#friend-list", + }, + breadcrumb: { + "@type": "BreadcrumbList", + "@id": "https://jaspermayone.com/friends#breadcrumb", + itemListElement: [ + { + "@type": "ListItem", + position: 1, + name: "Home", + item: "https://jaspermayone.com", + }, + { + "@type": "ListItem", + position: 2, + name: "Friends", + item: "https://jaspermayone.com/friends", + }, + ], + }, + }, + { + "@type": "ItemList", + "@id": "https://jaspermayone.com/friends#friend-list", + name: "Friends", + description: "Friends of Jasper Mayone", + numberOfItems: friends.length, + itemListElement: friends.map((friend, index) => ({ + "@type": "ListItem", + position: index + 1, + item: { + "@type": "Person", + name: friend.name, + ...(friend.image ? { image: `${siteUrl}${friend.image}` } : {}), + ...(friend.link ? { url: friend.link } : {}), + }, + })), + }, + ], +}; + +function initials(name: string): string { + const words = name.split(" "); + const first = words[0]?.[0] ?? ""; + const last = words.length > 1 ? (words[words.length - 1][0] ?? "") : ""; + return `${first}${last}`.toUpperCase(); +} + +export default function Friends() { + return ( + <> +