Files
Reactive-Resume/apps/client/src/pages/home/sections/contributors/index.tsx
Amruth Pillai e87b05a93a release: v4.1.0
2024-05-05 14:55:06 +02:00

68 lines
2.6 KiB
TypeScript

import { t } from "@lingui/macro";
import { Avatar, AvatarFallback, AvatarImage, Tooltip } from "@reactive-resume/ui";
import { cn } from "@reactive-resume/utils";
import { motion } from "framer-motion";
import { useMemo } from "react";
import { useContributors } from "@/client/services/resume/contributors";
export const ContributorsSection = () => {
const { github, crowdin, loading } = useContributors();
const contributors = useMemo(() => {
if (github && crowdin) return [...github, ...crowdin];
return [];
}, [github, crowdin]);
return (
<section id="contributors" className="container relative space-y-12 py-24 sm:py-32">
<div className="space-y-6 text-center">
<h1 className="text-4xl font-bold">{t`By the community, for the community.`}</h1>
<p className="mx-auto max-w-3xl leading-loose">
{t`Reactive Resume thrives thanks to its vibrant community. This project owes its progress to numerous individuals who've dedicated their time and skills. Below, we celebrate the coders who've enhanced its features on GitHub and the linguists whose translations on Crowdin have made it accessible to a broader audience.`}
</p>
</div>
{loading && (
<div className="mx-auto flex max-w-5xl flex-wrap items-center justify-center gap-3">
{Array.from({ length: 30 })
.fill(0)
.map((_, index) => (
<motion.div
key={index}
viewport={{ once: true }}
initial={{ opacity: 0, scale: 0 }}
whileInView={{ opacity: 1, scale: 1, transition: { delay: index * 0.05 } }}
>
<Avatar>
<AvatarFallback></AvatarFallback>
</Avatar>
</motion.div>
))}
</div>
)}
<div className="mx-auto flex max-w-5xl flex-wrap items-center justify-center gap-3">
{contributors.map((contributor, index) => (
<motion.div
key={index}
viewport={{ once: true }}
initial={{ opacity: 0, scale: 0 }}
className={cn(index >= 30 && "hidden lg:block")}
whileInView={{ opacity: 1, scale: 1, transition: { delay: index * 0.025 } }}
>
<a href={contributor.url} target="_blank" rel="noreferrer">
<Tooltip content={contributor.name}>
<Avatar>
<AvatarImage src={contributor.avatar} alt={contributor.name} />
<AvatarFallback>{contributor.name}</AvatarFallback>
</Avatar>
</Tooltip>
</a>
</motion.div>
))}
</div>
</section>
);
};