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
83 changes: 68 additions & 15 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"@tailwindcss/vite": "^4.0.4",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"framer-motion": "^12.4.7",
"framer-motion": "^12.5.0",
"lucide-react": "^0.476.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
Expand Down
6 changes: 6 additions & 0 deletions public/assets/LinksLogos/conduct.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions public/assets/LinksLogos/developer.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/assets/LinksLogos/github.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions public/assets/LinksLogos/mailingList.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions public/assets/LinksLogos/matrix.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions public/assets/LinksLogos/projects.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions public/assets/LinksLogos/translation.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/assets/Volunteer/volunteer-group.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/fonts/Oswald-Regular.ttf
Binary file not shown.
38 changes: 38 additions & 0 deletions src/components/DeveloperLinks.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { developerLinks } from '@/constants/VolunteerAndDev/Links';

const DeveloperLinks = () => {
return (
<section className="container mx-auto text-center p-6">
<div className="mt-6 flex flex-col items-center gap-4 w-full max-w-3xl mx-auto">
{developerLinks.map((link, index) => (
<a
key={index}
href={link.url}
target="_blank"
rel="noopener noreferrer"
className="relative w-full flex items-center justify-between border border-gray-400 px-6 py-4 rounded-full
overflow-hidden transition-all group"
>
{/* Expanding Oval Background Effect */}
<span className="absolute inset-0 bg-black rounded-full scale-0 group-hover:scale-150 transition-transform duration-300 origin-center"></span>

{/* Link Content (Ensuring text/icons stay above the background) */}
<div className="relative flex items-center gap-3 transition-all group-hover:text-white">
<img
src={link.icon}
alt={link.name}
className="w-6 h-6 transition-all group-hover:invert"
/>
<span className="text-lg font-medium">{link.name}</span>
</div>
<span className="relative text-xl transition-all group-hover:text-white">
</span>
</a>
))}
</div>
</section>
);
};

export default DeveloperLinks;
167 changes: 167 additions & 0 deletions src/components/DeveloperTestimonials.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import { motion } from 'framer-motion';
import { Marquee } from '@/components/magicui/Marquee'; // Marquee for scrolling effect
import { developertestimonials } from '@/constants/VolunteerAndDev/DeveloperTestimonials';
import { stats } from '@/constants/Stats';
import {
testimonialCard,
testimonialHeading,
decorativeElement,
testimonialText,
avatarReveal,
marqueeContainer,
} from '@/styles/Animations';

const ReviewCard = ({
img,
name,
username,
body,
delay = 0,
}: {
img: string;
name: string;
username: string;
body: string;
delay?: number;
}) => {
return (
<motion.div
className="bg-white dark:bg-gray-900 rounded-xl p-6 flex flex-col items-center text-center min-h-[250px] h-auto w-[350px] shadow-lg border border-gray-200 dark:border-gray-700 mx-2"
variants={testimonialCard}
initial="hidden"
whileInView="visible"
whileHover="hover"
viewport={{ once: true, amount: 0.1 }}
transition={{ delay }}
>
{/* Quote Icon */}
<motion.img
src={stats.apostrophie}
alt="double-quotes"
className="w-10 h-10 self-start opacity-70"
variants={decorativeElement}
/>

{/* Feedback Text */}
<motion.p
className="text-gray-700 dark:text-gray-300 mt-2"
variants={testimonialText}
>
{body}
</motion.p>

{/* User Info */}
<div className="flex items-center mt-4 space-x-3">
<motion.img
src={img}
alt={name}
className="w-12 h-12 rounded-full border border-gray-300"
variants={avatarReveal}
/>
<motion.div variants={testimonialText}>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">
{name}
</h3>
<p className="text-sm text-gray-500 dark:text-gray-400">
@{username}
</p>
</motion.div>
</div>
</motion.div>
);
};

export function DeveloperTestimonials() {
const firstRow = developertestimonials.slice(
0,
Math.ceil(developertestimonials.length / 2),
);

return (
<div className="w-full p-6">
{/* Heading Section with Hearts */}
<motion.div
className="flex items-center justify-center gap-4 md:gap-6 mb-12"
initial="hidden"
whileInView="visible"
viewport={{ once: true, amount: 0.6 }}
variants={marqueeContainer}
>
{/* Left Heart */}
<motion.img
src={stats.leftHeart}
alt="Heart Left"
className="w-8 md:w-12 lg:w-16 fill-current text-red-500 border-none shadow-none"
variants={decorativeElement}
animate="float"
custom={1}
/>

<div className="relative flex items-center justify-center gap-4 md:gap-6 lg:gap-8">
{/* Left Apostrophe (Hidden Below 400px) */}
<motion.img
src={stats.apostrophie}
alt="Apostrophe Left"
className="w-8 md:w-12 lg:w-16 -translate-y-2 block max-[400px]:hidden"
variants={decorativeElement}
custom={2}
/>

<motion.h2
className="font-bold tracking-wider font-Caveat text-3xl md:text-5xl lg:text-6xl text-gray-800 text-center"
variants={testimonialHeading}
>
<span className="text-5xl font-bold font-[Caveat]">
What our developers say
<br />
about their journey??
</span>
</motion.h2>
<hr className="w-32 border-t-2 border-gray-400 mx-auto mt-2" />

{/* Right Apostrophe (Flipped, Hidden Below 400px) */}
<motion.img
src={stats.apostrophie}
alt="Apostrophe Right"
className="w-8 md:w-12 lg:w-16 -translate-y-2 scale-x-[-1] block max-[400px]:hidden"
variants={decorativeElement}
custom={3}
/>
</div>

{/* Right Heart */}
<motion.img
src={stats.rightHeart}
alt="Heart Right"
className="w-8 md:w-12 lg:w-16 fill-current text-red-500 border-none shadow-none"
variants={decorativeElement}
animate="float"
custom={4}
/>
</motion.div>

{/* Testimonials Section */}
<motion.div
className="relative flex flex-col items-center justify-center w-full overflow-hidden mt-6"
initial="hidden"
whileInView="visible"
viewport={{ once: true, amount: 0.1 }}
variants={marqueeContainer}
>
{/* First Row (left to right) */}
<Marquee pauseOnHover className="w-full">
{firstRow.map((review, index) => (
<ReviewCard
key={review.username}
{...review}
delay={index * 0.05}
/>
))}
</Marquee>

<div className="pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r from-background"></div>
<div className="pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l from-background"></div>
</motion.div>
</div>
);
}
Loading