diff --git a/public/images/avatar/jesus-mena.jpg b/public/images/avatar/jesus-mena.jpg new file mode 100644 index 0000000..c53cb3a Binary files /dev/null and b/public/images/avatar/jesus-mena.jpg differ diff --git a/public/images/avatar/juan-velasquez.png b/public/images/avatar/juan-velasquez.png new file mode 100644 index 0000000..d6811de Binary files /dev/null and b/public/images/avatar/juan-velasquez.png differ diff --git a/public/images/avatar/mateo-usme.png b/public/images/avatar/mateo-usme.png new file mode 100644 index 0000000..c85fb5d Binary files /dev/null and b/public/images/avatar/mateo-usme.png differ diff --git a/public/images/avatar/veruzka-borges.png b/public/images/avatar/veruzka-borges.png new file mode 100644 index 0000000..4c7112c Binary files /dev/null and b/public/images/avatar/veruzka-borges.png differ diff --git a/public/images/avatar/yurley-sanchez.jpg b/public/images/avatar/yurley-sanchez.jpg new file mode 100644 index 0000000..d096126 Binary files /dev/null and b/public/images/avatar/yurley-sanchez.jpg differ diff --git a/public/images/flags/flag-bo.svg b/public/images/flags/flag-bo.svg new file mode 100644 index 0000000..e1bc08e --- /dev/null +++ b/public/images/flags/flag-bo.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-ca.svg b/public/images/flags/flag-ca.svg new file mode 100644 index 0000000..4cb1615 --- /dev/null +++ b/public/images/flags/flag-ca.svg @@ -0,0 +1,6 @@ + diff --git a/public/images/flags/flag-cl.svg b/public/images/flags/flag-cl.svg new file mode 100644 index 0000000..96b8ae2 --- /dev/null +++ b/public/images/flags/flag-cl.svg @@ -0,0 +1,6 @@ + diff --git a/public/images/flags/flag-co.svg b/public/images/flags/flag-co.svg new file mode 100644 index 0000000..8c8a3f3 --- /dev/null +++ b/public/images/flags/flag-co.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-ec.svg b/public/images/flags/flag-ec.svg new file mode 100644 index 0000000..8c8a3f3 --- /dev/null +++ b/public/images/flags/flag-ec.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-gt.svg b/public/images/flags/flag-gt.svg new file mode 100644 index 0000000..441bc45 --- /dev/null +++ b/public/images/flags/flag-gt.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-mx.svg b/public/images/flags/flag-mx.svg new file mode 100644 index 0000000..9133912 --- /dev/null +++ b/public/images/flags/flag-mx.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-pe.svg b/public/images/flags/flag-pe.svg new file mode 100644 index 0000000..20e8405 --- /dev/null +++ b/public/images/flags/flag-pe.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-uy.svg b/public/images/flags/flag-uy.svg new file mode 100644 index 0000000..2e5584e --- /dev/null +++ b/public/images/flags/flag-uy.svg @@ -0,0 +1,9 @@ + diff --git a/public/images/flags/flag-ve.svg b/public/images/flags/flag-ve.svg new file mode 100644 index 0000000..230a373 --- /dev/null +++ b/public/images/flags/flag-ve.svg @@ -0,0 +1,5 @@ + diff --git a/public/images/flags/flag-world.svg b/public/images/flags/flag-world.svg new file mode 100644 index 0000000..71cfcbe --- /dev/null +++ b/public/images/flags/flag-world.svg @@ -0,0 +1,5 @@ + diff --git a/src/app/(pages)/team/[slug]/page.tsx b/src/app/(pages)/team/[slug]/page.tsx new file mode 100644 index 0000000..894eb80 --- /dev/null +++ b/src/app/(pages)/team/[slug]/page.tsx @@ -0,0 +1,108 @@ +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + +import CTASection from "@/components/blocks/cta/cta"; +import TeamMemberDetail from "@/components/blocks/team/team-member-detail"; +import SectionSeparator from "@/components/section-separator"; +import { STATIC_PRERENDER_LOCALE } from "@/lib/site-locale-constants"; +import { siteMessages } from "@/lib/site-messages"; +import { getSiteUrl, webPageJsonLd, websiteJsonLd } from "@/lib/site-seo"; +import { getAllTeamMemberSlugs, getTeamMemberBySlug } from "@/lib/team"; +import { + buildTeamMemberJsonLd, + buildTeamMemberPageMetadata, + getTeamMemberShareImageUrl, +} from "@/lib/team-seo"; + +export async function generateStaticParams() { + return getAllTeamMemberSlugs().map((slug) => ({ slug })); +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug: string }>; +}): Promise { + const { slug } = await params; + + return buildTeamMemberPageMetadata(slug, STATIC_PRERENDER_LOCALE); +} + +export const dynamicParams = false; + +const TeamMemberSlugPage = async ({ + params, +}: { + params: Promise<{ slug: string }>; +}) => { + const { slug } = await params; + + const member = getTeamMemberBySlug(slug); + + if (!member) { + notFound(); + } + + const messages = siteMessages[STATIC_PRERENDER_LOCALE]; + const memberUrl = `${getSiteUrl()}/team/${slug}`; + const shareImageUrl = getTeamMemberShareImageUrl(slug); + const personJsonLd = buildTeamMemberJsonLd(slug, memberUrl); + + const jsonLd = { + "@context": "https://schema.org", + "@graph": [ + websiteJsonLd(), + webPageJsonLd({ + name: `${member.name} — ${messages.pageMeta.team.title}`, + description: messages.pageMeta.team.description, + url: memberUrl, + image: shareImageUrl, + }), + ...(personJsonLd ? [personJsonLd] : []), + { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + itemListElement: [ + { + "@type": "ListItem", + position: 1, + name: messages.nav.home, + item: `${getSiteUrl()}/`, + }, + { + "@type": "ListItem", + position: 2, + name: messages.nav.team, + item: `${getSiteUrl()}/team`, + }, + { + "@type": "ListItem", + position: 3, + name: member.name, + item: memberUrl, + }, + ], + }, + ], + }; + + return ( + <> + + + + + + +