diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 32eed89..4c063ee 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -18,6 +18,19 @@ export const metadata: Metadata = { description: "A student-run nonprofit making tech education free and accessible for everyone, everywhere.", alternates: { canonical: "/about/" }, + openGraph: { + title: "About Us | CodeWithPurpose", + description: + "A student-run nonprofit making tech education free and accessible for everyone, everywhere.", + url: "/about/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "About Us | CodeWithPurpose", + description: + "A student-run nonprofit making tech education free and accessible for everyone, everywhere.", + }, }; const founders: TeamMember[] = [ diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index 15abb3c..242172b 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -9,6 +9,17 @@ export const metadata: Metadata = { title: "Contact", description: "Get in touch with the CodeWithPurpose team.", alternates: { canonical: "/contact/" }, + openGraph: { + title: "Contact | CodeWithPurpose", + description: "Get in touch with the CodeWithPurpose team.", + url: "/contact/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Contact | CodeWithPurpose", + description: "Get in touch with the CodeWithPurpose team.", + }, }; export default function ContactPage() { diff --git a/src/app/courses/page.tsx b/src/app/courses/page.tsx index 0f94dce..727adc8 100644 --- a/src/app/courses/page.tsx +++ b/src/app/courses/page.tsx @@ -36,6 +36,19 @@ export const metadata: Metadata = { description: "Free courses and interactive lessons for students worldwide. Python, Vibecoding, Machine Learning, Financial Literacy, and Health in Tech.", alternates: { canonical: "/courses/" }, + openGraph: { + title: "Free Coding Courses | CodeWithPurpose", + description: + "Free courses and interactive lessons for students worldwide. Python, Vibecoding, Machine Learning, Financial Literacy, and Health in Tech.", + url: "/courses/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Free Coding Courses | CodeWithPurpose", + description: + "Free courses and interactive lessons for students worldwide. Python, Vibecoding, Machine Learning, Financial Literacy, and Health in Tech.", + }, }; interface Course { diff --git a/src/app/donate/page.tsx b/src/app/donate/page.tsx index 6e484a3..f69a7b3 100644 --- a/src/app/donate/page.tsx +++ b/src/app/donate/page.tsx @@ -11,6 +11,19 @@ export const metadata: Metadata = { description: "Support CodeWithPurpose. Every dollar helps a student start their coding journey today.", alternates: { canonical: "/donate/" }, + openGraph: { + title: "Donate | CodeWithPurpose", + description: + "Support CodeWithPurpose. Every dollar helps a student start their coding journey today.", + url: "/donate/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Donate | CodeWithPurpose", + description: + "Support CodeWithPurpose. Every dollar helps a student start their coding journey today.", + }, }; const impactAreas = [ diff --git a/src/app/impact/page.tsx b/src/app/impact/page.tsx index f49e716..89488b5 100644 --- a/src/app/impact/page.tsx +++ b/src/app/impact/page.tsx @@ -22,6 +22,19 @@ export const metadata: Metadata = { description: "5,000+ students across 150+ countries, and the stories behind the numbers.", alternates: { canonical: "/impact/" }, + openGraph: { + title: "Impact & Stories | CodeWithPurpose", + description: + "5,000+ students across 150+ countries, and the stories behind the numbers.", + url: "/impact/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Impact & Stories | CodeWithPurpose", + description: + "5,000+ students across 150+ countries, and the stories behind the numbers.", + }, }; const stats = [ diff --git a/src/app/join/page.tsx b/src/app/join/page.tsx index eaef242..89bdb08 100644 --- a/src/app/join/page.tsx +++ b/src/app/join/page.tsx @@ -16,6 +16,19 @@ export const metadata: Metadata = { description: "Volunteer with CodeWithPurpose. Teach, mentor, and help bring free coding education to students worldwide.", alternates: { canonical: "/join/" }, + openGraph: { + title: "Join Us | CodeWithPurpose", + description: + "Volunteer with CodeWithPurpose. Teach, mentor, and help bring free coding education to students worldwide.", + url: "/join/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Join Us | CodeWithPurpose", + description: + "Volunteer with CodeWithPurpose. Teach, mentor, and help bring free coding education to students worldwide.", + }, }; const roles = [ diff --git a/src/app/media/page.tsx b/src/app/media/page.tsx new file mode 100644 index 0000000..5c8336e --- /dev/null +++ b/src/app/media/page.tsx @@ -0,0 +1,39 @@ +import type { Metadata } from "next"; +import { MediaLibrary } from "@/components/media/MediaLibrary"; +import { PageHero, PageSection } from "@/components/PageHero"; +import { PageShell } from "@/components/PageShell"; +import { getMediaItems } from "@/lib/media"; + +export const metadata: Metadata = { + title: "Media", + description: + "Short lessons, student stories, and behind-the-scenes videos from CodeWithPurpose.", + alternates: { canonical: "/media/" }, + openGraph: { + title: "Media | CodeWithPurpose", + description: + "Short lessons, student stories, and behind-the-scenes videos from CodeWithPurpose.", + url: "/media/", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Media | CodeWithPurpose", + description: + "Short lessons, student stories, and behind-the-scenes videos from CodeWithPurpose.", + }, +}; + +export default function MediaPage() { + return ( + + + + + + + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 92dc4aa..7a52c9b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -8,6 +8,7 @@ import { GlobalReachSection } from "@/components/GlobalReachSection"; import { SecuritySection } from "@/components/SecuritySection"; import { QuoteSection } from "@/components/QuoteSection"; import { HowItWorksSection } from "@/components/HowItWorksSection"; +import { MediaSection } from "@/components/media/MediaSection"; import { FaqSection } from "@/components/FaqSection"; import { FinalCtaSection } from "@/components/FinalCtaSection"; import { SiteFooter } from "@/components/SiteFooter"; @@ -40,6 +41,7 @@ export default function Home() { + diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 44e9b6a..a29dbb4 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -22,6 +22,7 @@ export default function sitemap(): MetadataRoute.Sitemap { "/impact", "/contact", "/donate", + "/media", "/learn/ml", "/learn/vibecoding", "/learn/python", @@ -30,6 +31,7 @@ export default function sitemap(): MetadataRoute.Sitemap { "/learn/roblox", "/learn/github", "/learn/html-css", + "/learn/computer-vision", ].map((path) => ({ url: abs(path), lastModified: new Date(), diff --git a/src/components/PageHero.tsx b/src/components/PageHero.tsx index ef65a23..0d20ca1 100644 --- a/src/components/PageHero.tsx +++ b/src/components/PageHero.tsx @@ -17,7 +17,11 @@ export function PageHero({ return (