Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions src/app/[locale]/about/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
"use client";

import React from "react";
import PageWrapper from "@/components/PageWrapper";
import { GrowthChart } from "@/components/about/GrowthChart";
import { Timeline } from "@/components/about/Timeline";
import { Team } from "@/components/about/Team";
import { motion } from "framer-motion";
import { useTranslations } from "next-intl";

export default function AboutPage() {
const t = useTranslations("AboutPage");

const stats = [
{ value: "10+", label: t("stats.years") },
{ value: "20+", label: t("stats.projectsPerYear") },
{ value: "203+", label: t("stats.repositories") },
{ value: "88+", label: t("stats.mentors") },
{ value: "450+", label: t("stats.contributors") },
{ value: "8,000+", label: t("stats.communityMembers") },
];

return (
<PageWrapper>
<div className="w-full py-12 sm:py-16 px-4 sm:px-10 lg:px-14 max-w-7xl mx-auto flex flex-col gap-16">

{/* Header Hero */}
<div className="text-center max-w-4xl mx-auto flex flex-col items-center gap-6">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full border border-heading-highlight/30 bg-heading-highlight/10 text-xs font-semibold text-heading-highlight uppercase tracking-wider"
>
{t("badge")}
</motion.div>

<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.1 }}
className="text-4xl sm:text-5xl md:text-6xl font-extrabold tracking-tight text-foreground leading-[1.1]"
>
{t("title")}
</motion.h1>

<motion.p
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
className="text-base sm:text-lg text-foreground-secondary leading-relaxed max-w-3xl"
>
{t("subtitle")}
</motion.p>
</div>

{/* Stats Grid */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-4"
>
{stats.map((stat, idx) => (
<div
key={idx}
className="p-5 rounded-2xl border border-border bg-card shadow-xs text-center flex flex-col items-center justify-center hover:border-heading-highlight/40 transition-all"
>
<div className="text-2xl sm:text-3xl font-extrabold font-mono text-heading-highlight mb-1">
{stat.value}
</div>
<div className="text-xs text-foreground-muted font-medium uppercase tracking-wider">
{stat.label}
</div>
</div>
))}
</motion.div>

{/* Interactive Growth Chart Section */}
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.7 }}
>
<GrowthChart />
</motion.div>

{/* Timeline Section */}
<Timeline />

{/* Team Section */}
<Team />

</div>
</PageWrapper>
);
}
136 changes: 136 additions & 0 deletions src/app/[locale]/apply/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
"use client";

import React from "react";
import PageWrapper from "@/components/PageWrapper";
import { Link } from "@/i18n/navigation";
import { motion } from "framer-motion";
import { useTranslations } from "next-intl";

export default function ApplyPage() {
const t = useTranslations("ApplyPage");

const steps = [
{
step: "01",
title: t("s1Title"),
description: t("s1Desc"),
actionLabel: t("s1Action"),
actionUrl: "https://discord.gg/hjUhu33uAn",
},
{
step: "02",
title: t("s2Title"),
description: t("s2Desc"),
actionLabel: t("s2Action"),
actionUrl: "https://github.com/AOSSIE-Org",
},
{
step: "03",
title: t("s3Title"),
description: t("s3Desc"),
actionLabel: t("s3Action"),
actionUrl: "/programs",
},
{
step: "04",
title: t("s4Title"),
description: t("s4Desc"),
actionLabel: t("s4Action"),
actionUrl: "https://discord.gg/hjUhu33uAn",
},
{
step: "05",
title: t("s5Title"),
description: t("s5Desc"),
actionLabel: t("s5Action"),
actionUrl: "https://summerofcode.withgoogle.com",
},
];

return (
<PageWrapper>
<div className="w-full py-12 sm:py-16 px-4 sm:px-10 lg:px-14 max-w-5xl mx-auto flex flex-col gap-12">

{/* Header */}
<div className="text-center max-w-3xl mx-auto flex flex-col items-center gap-4">
<motion.div
initial={{ opacity: 0, y: 15 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full border border-heading-highlight/30 bg-heading-highlight/10 text-xs font-semibold text-heading-highlight uppercase tracking-wider"
>
{t("badge")}
</motion.div>

<motion.h1
initial={{ opacity: 0, y: 15 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.1 }}
className="text-4xl sm:text-5xl font-extrabold tracking-tight text-foreground"
>
{t("title")}
</motion.h1>

<motion.p
initial={{ opacity: 0, y: 15 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.2 }}
className="text-base sm:text-lg text-foreground-secondary leading-relaxed"
>
{t("subtitle")}
</motion.p>
</div>

{/* Timeline Steps Stack */}
<div className="flex flex-col gap-6">
{steps.map((item, idx) => (
<motion.div
key={idx}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: idx * 0.08 }}
className="p-6 sm:p-8 rounded-3xl border border-border bg-card shadow-xs flex flex-col md:flex-row items-start md:items-center justify-between gap-6 hover:border-heading-highlight/40 transition-all"
>
<div className="flex items-start gap-5">
<span className="text-2xl sm:text-3xl font-extrabold font-mono text-heading-highlight bg-heading-highlight/10 border border-heading-highlight/20 px-3.5 py-1.5 rounded-2xl shrink-0">
{item.step}
</span>

<div className="flex flex-col gap-2">
<h3 className="text-xl font-bold text-foreground">
{item.title}
</h3>
<p className="text-sm text-foreground-secondary leading-relaxed max-w-2xl">
{item.description}
</p>
</div>
</div>

{item.actionUrl.startsWith("/") ? (
<Link
href={item.actionUrl}
className="px-4 py-2.5 rounded-xl border border-border bg-background hover:bg-hover text-xs font-semibold text-foreground transition-all shrink-0 flex items-center gap-1.5 shadow-2xs w-full md:w-auto justify-center"
>
<span>{item.actionLabel}</span>
<span>→</span>
</Link>
) : (
<a
href={item.actionUrl}
target="_blank"
rel="noopener noreferrer"
className="px-4 py-2.5 rounded-xl border border-border bg-background hover:bg-hover text-xs font-semibold text-foreground transition-all shrink-0 flex items-center gap-1.5 shadow-2xs w-full md:w-auto justify-center"
>
<span>{item.actionLabel}</span>
<span>↗</span>
</a>
)}
</motion.div>
))}
</div>

</div>
</PageWrapper>
);
}
15 changes: 15 additions & 0 deletions src/app/[locale]/ideas/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { routing } from "@/i18n/routing";
import { redirect } from "@/i18n/navigation";

export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}

export default async function IdeasPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
redirect({ href: "/programs", locale });
}
2 changes: 2 additions & 0 deletions src/app/[locale]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { use } from "react";
import dynamic from "next/dynamic";
import Navbar from "@/components/Navbar";
import Hero from "@/components/Hero";
import Footer from "@/components/Footer";

function ProjectsSkeleton() {
return (
Expand Down Expand Up @@ -111,6 +112,7 @@ export default function Home({
<Projects />
<Stats />
</main>
<Footer />
</div>

{/* Right Edge Slanted Lines Column (Visible on mobile with w-5) */}
Expand Down
Loading
Loading